Questo perché stai usando un pool di connessioni che è stato creato non appena crei SessionFactory, ma le connessioni vengono acquisite solo quando apri una Session. Ora stai chiudendo la sessione, a causa della quale le connessioni vengono rilasciate, ma non vengono chiuse e vengono bloccate dal pool. Ora stai nuovamente creando una SessionFactory, quindi creando un nuovo pool, quindi ottenendo una sessione, quindi creando una nuova connessione e così via.. che alla fine raggiungerà il numero massimo di connessioni consentite.
Quello che devi fare è usare un Connection Pool (usando una SessionFactory) e ottenere e rilasciare le connessioni dallo stesso pool.
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();
}
}