Hibernate实战数据持久化之三管理hibernate的session高效率实现方案---ThreadLocal

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lycyl/article/details/80505575

    在使用Hibernate的时候,各种CRDU操作大都是通过session来完成的。如何避免频繁地创建和销毁呢?在Hibernate中session是由SessionFactory创建的,SessionFactory是线程安全的,即多个并发的线程可以同时访问并从中获取与其他线程不同的一个session实例。但是,session非线程安全的。可以设想如果让多个线程去使用一个session,那么很有可能导致数据存储混乱,出现问题。


ThreadLocal的实现原理

          threalocal类提供了线程局部变量,这些变量不同于一般的副本,因为通过get()或set()方法访问这些变量的线程它们都有自 己独立初始化的变量副本。 threalocal其实本质上是一个工具类,用来操作线程的一个类型为 ThreadLocalMap的 属性 threadLocals。

首先,理解ThreadLocalMap、ThreadLocal和Thread之间的关系。

          ThreadLocalMap是ThreadLocal类内部维护的一个内部类,类似于Map。Thread有一个ThreadLocalMap类型的属性,叫作threadLocals。 所以 ThreadLocal是联系ThreadLocalMap和Thread的桥梁。


    其次是ThreadLocal的核心方法 set( value ),get(), getMap( Thread   t ), initialValue(), setInitialValue()。

set(value)方法

    set方法首先获取当前线程thread,再通过thread得到属性threadLocals 。如果对应的 t hreadLocals 不为空,则以当前的 ThreadLocal对象作为key, value作为map的value压入map。如果对应的threadLocals为空,那么就调用createMap ( Thread   t , T  firstValue )方法,对当前线程的 threadLocals 属性进行初始化。

这样的话,传入的参数T value就成为了当前属性threadLocals 的元素,也就跟当前线程绑定了


其他的核心方法就不赘述了,可以参考源码。

下面进入正题,如何利用ThreadLocal实现高效率管理?

很简单,代码如下:

Session s = session.get();
if(s == null || !s.isOpen()) {
            s = sessionFactory.openSession();
            //绑定线程到当前线程thread
            session.set(s);
        }
return s;

猜你喜欢

转载自blog.csdn.net/lycyl/article/details/80505575