代码中的ThreadLocal在这个HibernateSessionFactory中啥作用?为啥还要重建sessionFactory?求助谢谢!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了代码中的ThreadLocal在这个HibernateSessionFactory中啥作用?为啥还要重建sessionFactory?求助谢谢!相关的知识,希望对你有一定的参考价值。

package hibernatesession;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.cfg.Configuration;
public class HibernateSessionFactory
private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";
private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
private static Configuration configuration = new Configuration();
private static org.hibernate.SessionFactory sessionFactory;
private static String configFile = CONFIG_FILE_LOCATION;
//初始化sessionFactory,只在第一次加载的时候执行,
static
try
configuration.configure(configFile);
sessionFactory = configuration.buildSessionFactory();
catch (Exception e)
e.printStackTrace();


//获取Session
public static Session getSession() throws HibernateException
Session session = (Session) threadLocal.get();
if (session == null || !session.isOpen())
if (sessionFactory == null)
rebuildSessionFactory();//重建sessionFactory

session = (sessionFactory != null) ? sessionFactory.openSession()
: null;
threadLocal.set(session);

return session;

//重建sessionFactory
public static void rebuildSessionFactory()
try
configuration.configure(configFile);
sessionFactory = configuration.buildSessionFactory();
catch (Exception e)
e.printStackTrace();


//关闭Session
public static void closeSession() throws HibernateException
Session session = (Session) threadLocal.get();
threadLocal.set(null);
if (session != null)
session.close();


ThreadLocal获取的对象是原来对象的一份拷贝,这样保证对象间是线程安全的,对于有状态的对象来说需要各自保持自己的状态,对象间不能共用,而是单独的。
rebuildSessionFactory() 只是在没有获取到session的情况,也就是之前在static块中没有成功初始化才会出现拿不到session的情况。
参考技术A sessionFactory 为二级换,session为一级缓存,从上面代码看出来,一般没必要这么写,sessionFactory 一般会在Hibernate中进行配置,要获取session也非常简单,比如ServletActionContext.getRequest().getSession();,这里代码目的就是为了获取session,session的获取,是先由Configuration 创建sessionFactory 对象,再来创建session

那么Session是否是线程安全的呢?很遗憾,答案是否定的,Session中包含了数据库操作相关的状态信息,那么说如果多个线程同时使用一个Session实例进行CRUD,就很有可能导致数据存取的混乱。在Session的众多管理方案中,引进了一种名ThreadLocal模式的解决方案。详细信息请看http://tech.ddvip.com/2009-09/1253090007133108.html
重建sessionFactory因为是为了在运行程序的时候保证sessionFactory不为空追问

session = (sessionFactory != null) ? sessionFactory.openSession()
: null;这句话是什么意思???谢谢

Python中的threadlocal

在多线程中,对于共有的共享数据的操作,需要加锁

但是,对于局部变量,则在每个线程之间相互独立

假如线程T想要把函数F1中的局部变量V1传到函数F2中去,F2再想把这个变量传到F3中去,一层一层地传较为繁琐

将Python的threading.local()返回的对象命名为tl,将tl放在全局的位置,可在各个函数中为tl绑定属性

可以把tl视作一个字典,key值为线程id,value为一个字典,value代表的这个字典中包含我们绑定的属性。

这里有个问题是,如果线程T1知道了线程T2的id,那么岂不是能在线程T1中修改线程T2的数据吗?这牵扯到一个线程隔离的问题。

实际的threading.local()处理了这种情况,原理在稍后研究。

这样当多线程执行的时候,通过使用threading.local(),对于每个线程,可以在任何地方方便地存取自己线程对应的数据,

各个线程相互隔离,不会互相干扰。

以上是关于代码中的ThreadLocal在这个HibernateSessionFactory中啥作用?为啥还要重建sessionFactory?求助谢谢!的主要内容,如果未能解决你的问题,请参考以下文章

ThreadLocal那点事

谈谈Java引用和Threadlocal的那些事

java中的ThreadLocal详解及示例代码

ThreadLocal

Python中的threadlocal

ThreadLocal解析