还没有得到个很好的回复。有没有哪位大侠可以发表一下关于这个Session线程安全的问题呢?

解决方案 »

  1.   

    你到底是问hibernate的Session还是HttpSession啊。hibernate的session就相当于sql的Connection,和spring整合时由spring进行管理分配(结合连接池).
      

  2.   

    我问的是Hibernate Session。正常使用下Hibernate是与Spring整合使用是不须担心这个线程安全问题的,但因为现在的项目中,比较特殊,需要自己去封装个Hibernate Session这块的管理。所以才想了解这个问题。
      

  3.   

    好像还是没有回答到我关注的问题上“在Struts2中使用Session作为类成员变量时,若不使用threadLocal进行管理,Session是否已经是属于线程安全的呢?”
      

  4.   

    getCurentSesion() 这个已经把当前session绑定到 线程里面,你也可以用自己Threadlocal 实现。对与你说的struts2 Action 我觉得是安全的。等高手吧。。
      

  5.   

    应该可以我觉得,但是把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来解决.
      

  6.   

    是线程安全的,无论是用opensession还是getcurrentsession都是线程安全的,但是servlet不是单例、而且在mvc中action只是个控制器,业务逻辑不能写在action里面,session写在action中,造成逻辑混乱,防止session混乱,可以把session设置成servlet的局部变量。
      

  7.   

    myeclipse 加入hibernate ,生成的那个类就是线程安全的,只要不改动肯定没问题
      

  8.   

    可能不对,,struts2只是new了action而已,没有实例化多个servlet,所有只是在action中的变量是不存在线程安全的问题,而不是数据层不存在,
      你这里说的session应该是httpSession
      httpSession对象会被多次使用,也会被同一个用户的多个页面使用,所以他对于系统来说是线程不安全的。 
      

  9.   

    线程安全 openSession是开启一个新的会话 每个session之间数据是不共享的 getCurrentSession是将session绑定到ThreadLocal中
      

  10.   

    servlet是单例的吧,只要整个项目一启动,一个servlet只要被访问过一次,被构造出的这个servlet对象就会一直存在服务器web容器中的servlet对象池里面,之后只要是访问该servlet都不会再创建新的对象,而是直接调用对象池里面的,直到容器卸载或停止。不能把session设置成局部变量,这样只会让线程更加不安全,而且内聚度太低了,写一个service类,它不是单例的,让它处理业务逻辑,把session写在那个service类里面,servlet直接调用service类。