Ao usar um pool de conexões, chamando
Connection#close()
não fecha fisicamente a conexão, mas a retorna ao pool para reutilização futura. Em outras palavras, a conexão permanece aberta e esse é o objetivo de usar um pool. Bem, esse é o problema. Você está criando uma
SessionFactory
repetidamente (cada um criando seu próprio pool), enquanto você deve criá-lo apenas uma vez durante toda a vida útil do seu aplicativo. Se você não estiver usando nenhum framework em particular, isso normalmente é feito em alguma classe de utilitário (o famoso HibernateUtil
aula). O Tutorial do Hibernate oficial tem um exemplo muito básico de tal classe. Ou veja este que é um pouco mais rico.