hibernate本地线程与session绑定

         hibernate本地线程与session绑定:一个项目完成后可能有多个人同时操作,无法保证session是一个唯一的对象。若要保证session是唯一的对象,就要将session与本地线程绑定。

在overstackoverflow中有这样的说法:

                   

大概的意思是:使用openSession()的话,

  • 总是创建一个新的session对象
  • 你需要去明确的关闭session对象
  • 在单线程环境它比getCurrentSession()更慢
  • 你也不需要去配置任何属性,你就能够使用这个方法

如果你使用的是getCurrentSession()方法获取session的话,

  • 如果session不存在,它将创建一个新的session,否则在当前hibernate环境中使用同一个session
  • 你不需要去关闭session对象,它将自动被hibernate内部机制关闭
  • 在单线程环境它比opensession更快
  • 你需要去配置中附加hibernate.current_session_context_class这个属性,才能够调用getCurrentSession()方法否则将会抛出异常

我们怎样获取与本地线程绑定的session:

  • 首先在hibernate核心配置文件中配置
  • 调用sessionFactory里面的方法得到
//在hibernate.cfg.xml中配置,也就是Hibernate核心配置文件中。配置部位是在第二部分。

<property name="hibernate.current_session_context_class">thread</property>


//其中,上面的值一共有三个,但是我们一般只用thread,即Session对象与本地线程进行绑定。

- thread:Session对象的生命周期与本地线程绑定
- jta:Session对象的生命周期与JTA事务绑定
- managed:Hibernate委托程序来管理Session对象的生命周期

然后我们调用sessionFactory里面的方法得到:

但是我们一般是把获取本地线程session的代码放在utils中:

public class HibernateUtils {
    private static SessionFactory sessionFactory=null;
    static{
        Configuration configuration=new Configuration();
        configuration.configure();
        sessionFactory=configuration.buildSessionFactory();
    }
    public static SessionFactory getSessionFactory(){
        return sessionFactory;
    }
    public static Session getCurrentSession(){//在工具类里面获取与本地线程绑定的session。
        return sessionFactory.getCurrentSession();
    }
}
@Test
    public void showLocalSession(){
        Transaction transaction=null;
        Session session=null;

        try {
            session=HibernateUtils.getCurrentSession();

            transaction=session.beginTransaction();

            Book book=new Book("《ACM入门训练指南》", 99);

            session.save(book);

            transaction.commit();
        } catch (Exception e) {
            transaction.rollback();
        }
}

//不知道各位朋友是否发现了,我在上面的演示中并没有写关闭session的代码。
//其实通过单元测试工具就会知道,当我们在finaly里面写上关闭session的操作会显示session已经关闭。
//因为我们这里的session是绑定了本地线程的session,当本地线程被关闭后,session也就自然而然的被关闭了。就像是同一根绳子上面的蚂蚱。这样也就不用我们去关闭session了。


注意:绑定了本地线程的session是不用我们自己去关闭的!!!如果我们的sesson是没有与本地线程绑定的,是通过sessionFactory.openSession()获取的,那么就要我们自己手动进行关闭

如果在finaly中关闭session的结果:

               

扫描二维码关注公众号,回复: 3643570 查看本文章

猜你喜欢

转载自blog.csdn.net/qq_40434646/article/details/82625195