请问:HibernateSessionFactory里面的ThreadLocal什么作用?
private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
为什么要用这个,不用的话会发生什么?
------解决方案--------------------这样只为一个线程开一个session,节省空间,各各线程维护自己的session,互不干扰,不会存在并发问题,如果每次都openSession()的话是比较耗资源的
------解决方案--------------------无论是立即加载还是延迟加载必须要连接数据库的,而在java中连接数据库是依赖java.sql.Connection,在hibernate中session就是Connection的一层高级封装,一个session对应了一个Connection,要实现延迟加载必须有session才行.而且要进行延迟加载还必须保证是同一个session才行,用另外一个session去延迟加载前一个session的代理对象是不行的.大家都知道Connection是使用过后必须要进行关闭的,那么我们如何保证一次http请求过程中,一直都使用一个session呢,即一个Connection呢.而且还要保证http请求结束后正确的关闭.
好,现在我们知道了我们要解决的问题
1.如何保证http请求结束后正确的关闭session
2.如何保证http请求过程中一直使用同一个session
第一个问题很容易想到,使用过滤器
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain filterChain) {
try {
filterChain.doFilter(request, response);
} catch (
IOException e) {
e.printStackTrace();
} catch (
ServletException e) {
e.printStackTrace();
} finally {
try {
HibernateUtil.commitTransaction();
} catch (Exception e) {
HibernateUtil.rollbackTransaction();
} finally {
HibernateUtil.closeSession();
}
}
------解决方案--------------------如果是web的话每次请求可能要对数据库进行多次操作,如果使用ThreadLocal,你可以不必在每个操作好之后进行关闭,然后一起关闭每个线程的session