zoukankan      html  css  js  c++  java
  • java多线程使用HibernateSession 时报 No session 的解决办法(转)

    服务端新开多线程使用HibernateSession 杜绝No session

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

    解决办法:

    [java] view plaincopy在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 plaincopy在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 plaincopy在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。

  • 相关阅读:
    Oracle内置函数之数值型函数
    【Java基础】java 获得本日,本周,本月的时间戳区间
    【mybatis】1、入门CURD基本操作(环境搭建)
    【hibernate】<第二节>hibernate的一对多映射(基本类型)
    Hibernate Java、Hibernate、SQL 之间数据类型转换
    【hibernate】<第一节>hibernate简单入门
    WebService wsdl没有types的问题
    Hibernate出现javax.naming.NoInitialContextException 错误的解决办法
    easyui 的 DataGrid View 使用
    Date与String之间相互转换
  • 原文地址:https://www.cnblogs.com/Rozdy/p/4580174.html
Copyright © 2011-2022 走看看