多线程中使用HIBERNATE,解决NO SESSION 问题

在多线程环境中,新启动的线程需要绑定Hibernate Session以使用事务和延迟加载。通过在Runnable中绑定和关闭Session到线程,避免出现NO SESSION异常。使用`bindHibernateSessionToThread`和`closeHibernateSessionFromThread`方法实现线程间的Session管理。事务边界可以通过AOP或@Transactional注解控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文转自网络:

 

新起的线程需要绑定Hibernate session,才能在新线程中使用事务和延迟加载等功能,否则会曝出no session异常;

解决办法:

 

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
 
  1. new Runnable() {  
  2.                 @Override  
  3.                 public void run() {  
  4. //                  ----------绑定session到当前线程------------  
  5.                     SessionFactory sessionFactory = (SessionFactory)applicationContext.getBean("sessionFactory");  
  6.                     boolean participate = ConcurrentUtil.bindHibernateSessionToThread(sessionFactory);  
  7. //                  ---------你的业务---------------  
  8. <pre name="code" class="java">//                  ----------关闭session------------                     
  9.                     ConcurrentUtil.closeHibernateSessionFromThread(participate, sessionFactory);  
  10.                 }  
  11.                   
  12.             }  

 

 
 

bindHibernateSessionToThread方法:

 

 

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
 
  1. public static boolean bindHibernateSessionToThread(SessionFactory sessionFactory) {  
  2.     if (TransactionSynchronizationManager.hasResource(sessionFactory)) {  
  3.         // Do not modify the Session: just set the participate flag.  
  4.         return true;  
  5.     } else {  
  6.         Session session = sessionFactory.openSession();  
  7.         session.setFlushMode(FlushMode.MANUAL);  
  8.         SessionHolder sessionHolder = new SessionHolder(session);  
  9.         TransactionSynchronizationManager.bindResource(sessionFactory, sessionHolder);  
  10.     }  
  11.     return false;  
  12. }  


closeHibernateSessionFromThread方法

 

 

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
 
  1. public static void closeHibernateSessionFromThread(boolean participate, Object sessionFactory) {  
  2.   
  3.     if (!participate) {  
  4.         SessionHolder sessionHolder = (SessionHolder)TransactionSynchronizationManager.unbindResource(sessionFactory);  
  5.         SessionFactoryUtils.closeSession(sessionHolder.getSession());  
  6.     }  
  7. }  

 

 

事务边界则由aop或者Transactional标记来控制,示例代码只是保证具备事务性的方法在需要的时候能从当前线程中获得session对象。

上述代码大部分截取自Spring的OpenSessionInViewFilter。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值