Това е така, защото използвате пул за връзки, който е създаден веднага след като изградите SessionFactory, но връзките се придобиват само когато отворите сесия. Сега затваряте сесията, поради което връзките се освобождават, но не се затварят и се задържат от пула. Сега вие отново създавате SessionFactory, следователно създавате нов пул, след това получавате сесия, следователно създавате нова връзка и т.н., което в крайна сметка ще достигне максималния брой разрешени връзки.
Това, което трябва да направите, е да използвате един пул за връзки (използвайки един SessionFactory) и да получите и освободите връзките от същия пул.
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();
}
}