En effet, vous utilisez un pool de connexions qui a été créé dès que vous avez créé SessionFactory, mais les connexions ne sont acquises que lorsque vous ouvrez une session. Maintenant, vous fermez la session, en raison de laquelle les connexions sont libérées, mais ne sont pas fermées et sont bloquées par le pool. Maintenant, vous créez à nouveau une SessionFactory, donc créez un nouveau pool, puis obtenez une session, donc créez une nouvelle connexion et ainsi de suite... qui finira par atteindre le nombre maximum de connexions autorisées.
Ce que vous devez faire est d'utiliser un pool de connexions (en utilisant une SessionFactory) et d'obtenir et de libérer les connexions du même 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();
}
}