日期:2014-05-19  浏览次数:20812 次

请问: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