Hibernate中的ThreadLocal类

我们知道,Session是Hibernate运行的核心,通过它来对对象的生命周期,事务的管理和数据库的存取进行管理。

首先我们来看一下threadLocal类。

我们从上一篇文章已经知道,SessionFactory是线程安全的,不同的线程对它的实例进行调用,不会发生数据共享方面的问题。而Session是又SessionFactory创建的,它却不是线程安全的,我们不能让session来进行数据共享。为了解决这个问题我们引入了ThreadLocal类。下面看一下代码:

Java代码

1.packagecom.jnotnull;

2.importorg.hibernate.*;

3.importorg.hibernate.cfg.*;

4.publicclassSessionTest{

5.privatestaticfinalSessionFactorysessionFactory;

6.static{

7.try{

8.sessionFactory=newConfiguration().configure().buildSessionFactory();

9.}catch(Exceptione){

10.}

11.

12.publicstaticfinalThreadLocalthreadlocal=newThreadLocal();

13.publicstaticSessioncurrentSession(){

14.Sessions=(Session)threadlocal.get();

15.if(s==null){

16.s=sessionFactory.openSession();

17.threadlocal.set(s);

18.}

19.returns;

20.}

21.}

22.

23.publicstaticvoidcloseSession(){

24.Sessions=(Session)threadlocal.get();

25.if(s!=null)

26.s.close();

27.threadlocal.set(null);

28.}

29.

30.}

packagecom.jnotnull;

importorg.hibernate.*;

importorg.hibernate.cfg.*;

publicclassSessionTest{

privatestaticfinalSessionFactorysessionFactory;

static{

try{

sessionFactory=newConfiguration().configure().buildSessionFactory();

}catch(Exceptione){

}

publicstaticfinalThreadLocalthreadlocal=newThreadLocal();

publicstaticSessioncurrentSession(){

Sessions=(Session)threadlocal.get();

if(s==null){

s=sessionFactory.openSession();

threadlocal.set(s);

}

returns;

}

}

publicstaticvoidcloseSession(){

Sessions=(Session)threadlocal.get();

if(s!=null)

s.close();

threadlocal.set(null);

}

}

这里我们可以看到运用ThreadLocal,可以在每一个线程中创建一个单独的Session,这样就保证了线程的安全了。

这里还要注意的是,这里的Session是保留着对各种操作的结果,和http中的session是不同的。

相关推荐