关于Hibernate Session线程安全问题
大家好,有个关于Hibernate Session线程安全问题的理解纠结了我很久,想请教一下大家。不知道大家对Hibernate的Session非线程安全是如何理解的呢?按我在网上查到的资料,是由于Servlet是属于单例模块,当Session实例作为Servlet的类成员变量时,就会出现多个线程访问同一个Session的问题,从而导至Session的非线程安全的情况,则需要通过threadLocal进行管理Session,以达到Session的线程安全。那么,Struts1的Action是属于单例模块,也同样存在这种非线程安全的情况。但Struts2的Action默认是多例模块,那么是不是就是说,在Struts2中使用Session作为类成员变量时,就不需要使用threadLocal进行管理,Session也已经是属于线程安全的呢? --------------------编程问答-------------------- 是的鸟。。。 --------------------编程问答-------------------- 还没有得到个很好的回复。有没有哪位大侠可以发表一下关于这个Session线程安全的问题呢? --------------------编程问答-------------------- 你到底是问hibernate的Session还是HttpSession啊。hibernate的session就相当于sql的Connection,和spring整合时由spring进行管理分配(结合连接池). --------------------编程问答-------------------- 我问的是Hibernate Session。正常使用下Hibernate是与Spring整合使用是不须担心这个线程安全问题的,但因为现在的项目中,比较特殊,需要自己去封装个Hibernate Session这块的管理。所以才想了解这个问题。 --------------------编程问答-------------------- 有没有哪位高人可以回答一下呢? --------------------编程问答-------------------- 直接写个线程池就完事了 ! --------------------编程问答------------------------ 说错了。。 数据库连接池 --------------------编程问答-------------------- 好像还是没有回答到我关注的问题上“在Struts2中使用Session作为类成员变量时,若不使用threadLocal进行管理,Session是否已经是属于线程安全的呢?” --------------------编程问答-------------------- getCurentSesion() 这个已经把当前session绑定到 线程里面,你也可以用自己Threadlocal 实现。对与你说的struts2 Action 我觉得是安全的。等高手吧。。 --------------------编程问答-------------------- 应该可以我觉得,但是把session设置成局部变量太浪费资源,没个线程没次访问数据库都分配一个session。
下面是我找的资料你可以看看:
Hibernate Session, 其作用无需多言.
在运用中为避免资源消耗,一般都会手动封装一个HibernateUtil类(未使用Spring管理的前提下).
该类的作用使Hibernate加载配置文件config, 创建sessionFactory等只运行一次.
实际运用中,经常需要将当前线程和session绑定.一般的用法为使用ThreadLocal: 在HibernateUtil类中封装hibernate的管理.通过openSession取得
session,并将其放入ThreadLocal变量中. 这样业务逻辑中仅需通过工具类取得当前线程对应的session.使用完毕后,调用工具类closeSession方法将
session关闭,当前线程的ThreadLocal变量置为NULL. 保证线程归还线程池复用后,ThreadLocal为空,以免出现导致其他线程访问到本线程变量.
而后,Hibernate的SessionFactory提供获取session的新方法getCurrentSession (获得与当前线程绑定的session). 内部通过代理封装,此方式得到的session
不仅和当前线程绑定,也无需手动开关. 默认在事务提交之后,session自动关闭. 需注意的是,必须在事务开启的前提之下才可使用此种方式获得的session.
此外hibernate.cfg.xml配置文件中也许配置
<property name="current_session_context_class">thread</property> 基于线程
末了,引入Spring之后.sessionfactory的创建等都交给spring管理.Spring也提供了HibernateTemplate,HibernateDaoSupport这样的封装方法.
用户可以不再考虑session的管理,事务的开启关闭.只需配置事务即可.
而所谓session关闭后,因延迟加载导致前台无法显示的问题以往解决方式为强制全部加载,现在也可通过在web.xml中配置
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter来解决.
--------------------编程问答-------------------- 是线程安全的,无论是用opensession还是getcurrentsession都是线程安全的,但是servlet不是单例、而且在mvc中action只是个控制器,业务逻辑不能写在action里面,session写在action中,造成逻辑混乱,防止session混乱,可以把session设置成servlet的局部变量。 --------------------编程问答-------------------- myeclipse 加入hibernate ,生成的那个类就是线程安全的,只要不改动肯定没问题 --------------------编程问答-------------------- 直接使用连接池 --------------------编程问答-------------------- 可能不对,,struts2只是new了action而已,没有实例化多个servlet,所有只是在action中的变量是不存在线程安全的问题,而不是数据层不存在,
你这里说的session应该是httpSession
httpSession对象会被多次使用,也会被同一个用户的多个页面使用,所以他对于系统来说是线程不安全的。
--------------------编程问答-------------------- 线程安全 openSession是开启一个新的会话 每个session之间数据是不共享的 getCurrentSession是将session绑定到ThreadLocal中 --------------------编程问答-------------------- 推荐使用连接池
补充:Java , Java EE