用ThreadLocal,模拟Hibernate getCurrentSession()

ThreadLocal与Hibernate Session
本文通过模拟Hibernate的SessionFactory.getCurrentSession()方法,介绍了如何使用ThreadLocal实现线程局部变量。每线程都拥有独立的Session实例,确保了线程安全。

用ThreadLocal线程局部变量,模拟Hibernate的 SessionFactory.getCurrentSession()


import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; //用ThreadLocal线程局部变量,模拟Hibernate的 SessionFactory.getCurrentSession(); public class HibernateUtil { //每线程都有一份Session private static final ThreadLocal<Session> localSession = new ThreadLocal<Session>(); private static SessionFactory sessionFactory; static { try { sessionFactory = new Configuration().configure() .buildSessionFactory(); } catch(Exception e) { e.printStackTrace(); } } public static Session getCurrentSession() { if(localSession.get() == null) localSession.set(sessionFactory.openSession()); return localSession.get(); } }


那么ThreadLocal怎样实现线程局部变量 呢??先不看JDK源码的话,最简就是每线程都增加一个private的属性XX,然后getXX()就

可以取得但这样每增加一个"线程局部变量"就要在java.lang.Thread里增加一个属性的话,那太多了,这太不好...

那JDK源码里是每个线程里都有一个Map,java.lang.Thread 里有个ThreadLocalMap threadLocals 的属性,里面存放

(ThreadLocal key,Object value)这样的<key,value>对,相当于每线程都有这个的Map:Map<ThreadLocal,Object>,

这样上述代码中,每线程都可以将 <localSession,Session> 这样的条目放进线程的ThreadLocalMap里...


for (final Map<String, Object> map : packageInfoIdList) { final Session session = sessionFactory.openSession(); final Transaction tx = session.beginTransaction(); // 多线程执行任务 Callable<Void> task = new Callable<Void>() { @Override public Void call() throws Exception { try { RmsPackageClinicalDrugsInfo packageClinicalDrugsInfo = clinicaldrugsEnable.findRmsPackageClinicalDrugsInfoById(Integer.valueOf(map.get("packageInfoId").toString())); // 查询包装回收记录 RmsPackageClinicalDrugsRecycle recycleInfo = drugEnable.findRmsPackageClinicalDrugsRecycleByGroupInfo(packageClinicalDrugsInfo, "在库回收", packageClinicalDrugsInfo.getRcdiId()); if (recycleInfo != null) { recycleInfo.setRecycleState((recycleInfo.getRecycleState() == 1 || recycleInfo.getRecycleState() == 4 || recycleInfo.getRecycleState() == 5) ? 1 : 2); // 被回收过为部分回收,不然为待回收 } else { // 新增一条包装回收记录 recycleInfo = new RmsPackageClinicalDrugsRecycle(); recycleInfo.setProjectCode(packageClinicalDrugsInfo.getPackageProjectCode()); recycleInfo.setProjectCodeTrialPhase(packageClinicalDrugsInfo.getPackageProjectCodeTrialPhase()); recycleInfo.setTrialPhase(packageClinicalDrugsInfo.getPackageTrialPhase()); recycleInfo.setDrugsIndication(packageClinicalDrugsInfo.getPackageDrugsIndication()); recycleInfo.setSchemeNum(packageClinicalDrugsInfo.getSchemeNum()); recycleInfo.setReceiveGoto("在库回收"); recycleInfo.setDrugsName(packageClinicalDrugsInfo.getPackageDrugsName()); recycleInfo.setRecycleClinicalDrugsType(packageClinicalDrugsInfo.getPackageClinicalDrugsType()); recycleInfo.setRecycleState(1); recycleInfo.setRcdiId(packageClinicalDrugsInfo.getRcdiId()); recycleInfo.setRecycleDrugsSpecs(packageClinicalDrugsInfo.getPackageSpecs()); recycleInfo.setRecycleDrugsPackingSpecs(packageClinicalDrugsInfo.getPackageDrugsPackingSpecs()); recycleInfo.setDrugsUnit(packageClinicalDrugsInfo.getDrugsUnit()); recycleInfo.setPackageUnit(packageClinicalDrugsInfo.getPackageUnit()); } drugEnable.saveOrUpdateRmsPackageClinicalDrugsRecycle(recycleInfo); // 处理回收逻辑 dealRecycleDetail(drugsStock, packageClinicalDrugsInfo, recycleInfo, packageInfoList, rfidMappingList, recycleDetailList, drugsActionMap, user, now); drugEnable.saveOrUpdateRmsPackageClinicalDrugsRecycle(recycleInfo); tx.commit(); // 提交事务 } catch (Exception e) { flag.append("错误"); if (tx != null && tx.isActive()) { tx.rollback(); // 回滚事务 } e.printStackTrace(); // 线程池异常 logger.error(e.toString()); } finally { if (session != null && session.isOpen()) { session.close(); // 在回滚后关闭 session } } return null; } }; // 提交任务执行 Future<?> future = recycleExecutor.submit(task); futures.add(future); }无法回滚
11-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值