tomcat中hibernate的数据库连接问题解决了
首先,把Hibernate的session管理模式设置为thread。那么每个thread将会有一个单独的SessionFactory
<!-- Enable Hibernate's automatic session context management -->
<property name="current_session_context_class">thread</property>
那么在线程结束的时候SessionFactory就会析构,然后所有资源都会被释放,数据库连接也会被释放。
然后写一个这样的Helper提供 SessionFactory
public class HibernateUtil {
private static final SessionFactory sessionFactory;
static {
。。。 初始化SessionFactory
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
然后呢,给tomcat做一个 Listener
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class HibernateListener implements ServletContextListener {
public void contextInitialized(ServletContextEvent event) {
HibernateUtil.getSessionFactory(); // Just call the static initializer of that class
}
public void contextDestroyed(ServletContextEvent event) {
HibernateUtil.getSessionFactory().close(); // Free all resources
}
}
于是每次请求结束的时候,它一定会调用 SessionFactory的close方法,那么数据库连接一定会被关闭
最后就是把这个监听器放到web.xml中
<listener>
<listener-class>mypackage.HibernateListener</listener-class>
</listener>
于是在代码中就只需要使用HibernateUtil.getSessionFactory().getCurrentSession()的方式来获取session,而从来不用调用session.close()手动关闭它。