Dzieje się tak, ponieważ używasz puli połączeń, która została utworzona zaraz po zbudowaniu SessionFactory, ale połączenia są uzyskiwane dopiero po otwarciu sesji. Teraz zamykasz sesję, dzięki czemu połączenia są zwalniane, ale nie są zamykane i są wstrzymywane przez pulę. Teraz ponownie tworzysz SessionFactory, a tym samym tworzysz nową pulę, a następnie uzyskujesz sesję, a tym samym tworzysz nowe połączenie itd., które ostatecznie osiągnie maksymalną dozwoloną liczbę połączeń.
Musisz użyć jednej puli połączeń (przy użyciu jednej SessionFactory) oraz uzyskać i zwolnić połączenia z tej samej puli.
public class DBConnection {
private static SessionFactory factory;
static {
factory = new Configuration().configure().buildSessionFactory();
}
public Session getSession() {
return factory.openSession();
}
public void doWork() {
Session session = getSession();
// do work.
session.close();
}
// Call this during shutdown
public static void close() {
factory.close();
}
}