如果不安全,请问在并发的时候怎么控制安全和高效直接通过Session session = HibernateSessionFactory.getSession();来获取sesion,每个方法执行的时候都去获取session,这样是否会引发线程不安全的问题呢?
望高手指教

解决方案 »

  1.   

    http://www.google.com.hk/search?hl=zh-CN&newwindow=1&safe=strict&q=hibernate+session+%E7%BA%BF%E7%A8%8B%E5%AE%89%E5%85%A8&aq=0&aqi=g2&aql=&oq=hibernate+session+%E7%BA%BF%E7%A8%8B&gs_rfai=
      

  2.   

    不要用这种方式来做..这样获取到的sesssion不在spring管理中,需要手动控制他的释放.
      用getHibernateTemplate()的方式来做吧.
      

  3.   

    hibernate session 是线程安全的,所以不需要回答你的第2个问题
    Session session = HibernateSessionFactory.getSession();只会获得本地线程的session
    不同线程取到的session是不一样的,原理是基于ThreadLocal实现
    这个你可以测试一下,看看每个线程取到的session是否同一个
      

  4.   

    我是这样理解的.首先肯定的是session是线程安全的,所以不用考虑线程的问题,我们只需要考虑效率的问题.我有一个疑惑,session为什么要使用单例模式.sessionFactory是一个应用里只存在一个.但是session不是吧.在一个应用中可能存在多个session啊,我看了些网上的文章,很多人都用单例模式创建session,这个对么?
      

  5.   

    Hibernate中两个缓存,
    sessionFactory是重量级的,线程安全,也叫一级缓存
    session是轻量级的,线程不安全,也叫二级缓存Session的使用原则就是一个线程一个session,session一次一个事务通过Threadlocal类可以把session绑定在当前线程上,
    也可以直接通过hbm配置文件设定current_session_context_class-thread
    然后通过SessionFactory.getCurrentSession()获得
      

  6.   

    自己说的“一个线程一个session”,然后又说线程不安全
    那。。无语了
      

  7.   

    因为session在多线程下不安全,所以才尽量保证一个session只被一个线程使用啊
      

  8.   

    我指的使用原则是指你要怎么去用session,而不是session自身就带有的。就像说equals相等hashcode必须相等是一个使用原则,是指程序员要遵守而不是系统已经帮你设定好了