Hibernate中使用ThreadLocal的疑问

ansensp 哈尔滨信息工程学院 高级java开发工程师  2011-01-09 06:27:57
以下是使用myEcplipse生成Hibernate的SessionFactory代码中的getSession的部分:
public static Session getSession() throws HibernateException{
Session session = threadLocal.get();
if(session==null || !session.isOpen()){
if(sessionFactory==null){
reBuildSessionFactory();
}
session = (sessionFactory==null ? null : sessionFactory.openSession());
threadLocal.set(session);
}
return session;
}

关于上述代码, 我有如下两个疑问, 希望大家帮忙指点迷津, 再此不胜感激!!!

(1). 假设对于一次特定的请求, 服务端需要多次访问数据库(即:需要调用Dao中不同的方法, 这些方法不能进行合并,Dao中的每个方法都是通过上述代码获取session), 那么在一个线程执行过程中, 在最后一次访问数据库之前, 都不应该关闭session, 否则ThreadLocal中得到将是一个已经close掉的session, 那么就需要重新创建session, 如果这样做, 使用ThreadLocal为了避免频繁的创建销毁session的作用就不大了! 应该怎样做呢?

(2). 在网上看到很多帖子, 说在这里使用ThreadLocal除了有避免频繁创建和销毁session的好处外, 还有一个特别大的好处,
就是可以做到多线程的数据隔离, 可以避免多个线程同时操作同一个session, 我十分的不理解, 这里就算不使用ThreadLocal
有怎么会出现多个线程操作同一个session的情况呢, 来一个线程就创建一个session会有冲突吗?
...全文
236 点赞 收藏 6
写回复
6 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
YOULOVEXIA 2011-01-10
[Quote=引用 2 楼 xiaoye2892 的回复:]
首先得认识threadLocal的意思,字面上意思“本地线程”,其实是线程的副本,为了处理并发访问问题而引进的,具体请看这里:http://blog.csdn.net/qjyong/archive/2008/03/08/2158097.aspx。
【使用ThreadLocal为了避免频繁的创建销毁session的作用】我认为不是这个作用
在实际开发中我们常遇到页面需要的数据在读出来之前sess……
[/Quote]

ding.......
回复
liufeng0209 2011-01-10
ThreadLocal 你可以这样理解:
服务器得到一个请求,通过ActionServlet分发给Action,Action调用service,service调用dao,最后将结果发到respone,这一个过程都是一个线程实现的,而ThreadLocal就是这个线程的环境或者叫上下文.
回复
wzju64676266 2011-01-09
你可以简单得理解成,使用threadlocal是为了,给每个线程开一个session(做crud操作),避免多长创建session


至于你说的
就是可以做到多线程的数据隔离, 可以避免多个线程同时操作同一个session, 我十分的不理解, 这里就算不使用ThreadLocal
有怎么会出现多个线程操作同一个session的情况呢

如果你把session放到非局部变量的方法体中,例如

public class Lei{
private Session session=getSession();

...insert 方法(){

使用session操作数据库
}

...update 方法(){

使用session操作数据库
}


这样就会公用一个session了


}


回复
xiaoye2892 2011-01-09
首先得认识threadLocal的意思,字面上意思“本地线程”,其实是线程的副本,为了处理并发访问问题而引进的,具体请看这里:http://blog.csdn.net/qjyong/archive/2008/03/08/2158097.aspx
【使用ThreadLocal为了避免频繁的创建销毁session的作用】我认为不是这个作用
在实际开发中我们常遇到页面需要的数据在读出来之前session已经关闭了,这个问题可以用openSessionInview来处理
回复
风过无痕1110 2011-01-09
问题1:session的close放在过滤器中,在一次用户请求完毕时关闭session,这次请求的所有数据库操作其实就是一个线程,这个线程只使用同一个session,如果在中途关闭,也就不能保证一致性了
问题2:这个问题很简单ThreadLocal就是将一个session对象和当前session绑定,其实最主要的作用是控制当前线程的事务操作,当然多个线程也不可能操作到同一个问题,你的意思是想问即使不用threadLocal只用sessionFactory.openSession()获得session也不会冲突,这样确实不冲突,因为这样是新开的session,但这个不是threadlocal解决的问题,数据隔离是有数据库连接决定的,只要每次获得的数据库连接不同,数据库自然就是隔离了
回复
相关推荐
发帖
Java EE
创建于2007-09-28

6.6w+

社区成员

J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
申请成为版主
帖子事件
创建了帖子
2011-01-09 06:27
社区公告
暂无公告