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()手动关闭它。

此博客中的热门博文

少写代码,多读别人写的代码

在windows下使用llvm+clang

tensorflow distributed runtime初窥