`
lvjun106
  • 浏览: 437916 次
  • 性别: Icon_minigender_1
  • 来自: 芜湖
社区版块
存档分类
最新评论

多线程中使用HIBERNATE,解决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。

分享到:
评论

相关推荐

    使用Hibernate一些常见错误解决办法

    同时,将映射文件(如`.hbm.xml`)放在同一个或统一的子目录中,并在配置文件中使用相对路径引用它们。如果希望自定义配置文件的位置,例如在`src`目录下创建`HibernateCfgs`子目录并放置配置文件,那么在创建会话...

    hibernate事务管理机制.doc

    **悲观锁**是预防性的锁定策略,它假设并发环境中多线程可能会同时修改同一数据,因此在读取数据时就对其进行锁定,直至事务结束才释放。在Hibernate中,悲观锁可以通过`LockMode`进行设置,如`LockMode.WRITE`、`...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     23.1.1 Session对象的生命周期与本地线程绑定  23.1.2 Session对象的生命周期与JTA事务绑定  23.2 实现对话  23.2.1 使用游离对象  23.2.2 使用手工清理缓存模式下的Session  23.3 小结  23.4 思考题 第24章...

    struts+spring+hibernate资料

    - **Session 对象的线程安全性**:Hibernate 的 Session 对象并不是线程安全的,这意味着对于每一个 HTTP 请求、会话或事务,通常应该仅在一个线程中使用一个 Session 实例。如果多个线程共享一个 Session 实例,则...

    JAVA错误文档.pdf

    6. 线程安全问题:在文档中提到“noSession-no-session”的错误信息,暗示了线程安全问题。当使用Hibernate时,每个线程应该有独立的Session,如果没有正确处理Session与线程的绑定,就会出现线程安全问题。 7. ...

    Java常见异常集-Java,Hibernate,Tomcat异常

    10. **ConcurrentModificationException**:在多线程环境下,当一个线程正在修改集合,而另一个线程尝试迭代该集合时,会抛出此异常。应使用并发友好的集合类或同步控制来避免这个问题。 11. **ServletException: ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     23.1.1 Session对象的生命周期与本地线程绑定  23.1.2 Session对象的生命周期与JTA事务绑定  23.2 实现对话  23.2.1 使用游离对象  23.2.2 使用手工清理缓存模式下的Session  23.3 小结  23.4 思考题 第24章...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     23.1.1 Session对象的生命周期与本地线程绑定  23.1.2 Session对象的生命周期与JTA事务绑定  23.2 实现对话  23.2.1 使用游离对象  23.2.2 使用手工清理缓存模式下的Session  23.3 小结  23.4 思考题 第24章...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     23.1.1 Session对象的生命周期与本地线程绑定  23.1.2 Session对象的生命周期与JTA事务绑定  23.2 实现对话  23.2.1 使用游离对象  23.2.2 使用手工清理缓存模式下的Session  23.3 小结  23.4 思考题 第24章...

    Java 中的悲观锁和乐观锁的实现

    - `LockMode.UPGRADE_NOWAIT`:Oracle特有的实现方式,使用`FOR UPDATE NOWAIT`子句实现锁定。 **4. 应用悲观锁的注意事项** - **锁定时机**:悲观锁必须在查询开始之前设置,即在Hibernate生成SQL语句之前设置,...

    PetGame.zip

    竞技过程可能需要并发处理多个用户的请求,所以多线程的使用是必不可少的,可以使用Thread或ExecutorService来管理并发任务。 用户冒险功能可能包含地图探索、任务完成等元素,这需要数据库存储游戏状态和进度。在...

    jdbc基础和参考

    ORM:使用元数据信息来描述对象和数据库之间的关系,并且能够自动实现java中持久化对象到关系型数据库中表的映射 脏检查:自动对缓存中的数据进行检查,并且选择在合适的时机和数据库之间进行交互,以保持数据的...

    ssh分页经典代码

    1. **配置Hibernate分页**: 在Hibernate的配置文件中,启用`c3p0`或其他连接池以支持多线程和数据库连接管理。在DAO层,引入`SessionFactory`和`Session`,使用`Query`或`Criteria`对象进行分页查询。例如,`query....

    Spring动态多数据源配置实例Demo

    解决这个问题的方法是在Web应用中使用OpenSessionInViewFilter,同时在Hibernate配置中指定`current_session_context_class`,让Spring管理Hibernate的Session。 在提供的Demo中,这些配置和原则得到了实践。Demo...

    SPRING面试宝典

    如果一个Bean的实例在多线程环境下被并发访问,开发者需要显式地确保线程安全性,例如通过同步机制。 **3.7 解释Spring框架中的Bean生命周期** Spring框架中的Bean生命周期主要包括以下几个阶段: 1. **实例化**...

    银行面试题目

    Java中的多线程** - **实现方式**: 继承`Thread`类或实现`Runnable`接口。 - **启动线程**: 调用线程对象的`start()`方法,该方法会自动调用`run()`方法。 - **并发问题**: 主要考虑共享资源的安全性和避免线程...

    compass-reference.pdf

    - **LockFactory**:用于实现并发控制,确保多个线程之间正确地共享资源。 - **LocalDirectoryCache**:本地目录缓存,用于提高性能。 - **LuceneDirectoryWrapper**:封装 Lucene 目录的行为,提供额外的功能。 - ...

Global site tag (gtag.js) - Google Analytics