本文转自网络:
新起的线程需要绑定Hibernate session,才能在新线程中使用事务和延迟加载等功能,否则会曝出no session异常;
解决办法:
- new Runnable() {
- @Override
- public void run() {
- // ----------绑定session到当前线程------------
- SessionFactory sessionFactory = (SessionFactory)applicationContext.getBean("sessionFactory");
- boolean participate = ConcurrentUtil.bindHibernateSessionToThread(sessionFactory);
- // ---------你的业务---------------
- <pre name="code" class="java">// ----------关闭session------------
- ConcurrentUtil.closeHibernateSessionFromThread(participate, sessionFactory);
- }
- }
bindHibernateSessionToThread方法:
- public static boolean bindHibernateSessionToThread(SessionFactory sessionFactory) {
- if (TransactionSynchronizationManager.hasResource(sessionFactory)) {
- // Do not modify the Session: just set the participate flag.
- return true;
- } else {
- Session session = sessionFactory.openSession();
- session.setFlushMode(FlushMode.MANUAL);
- SessionHolder sessionHolder = new SessionHolder(session);
- TransactionSynchronizationManager.bindResource(sessionFactory, sessionHolder);
- }
- return false;
- }
closeHibernateSessionFromThread方法
- public static void closeHibernateSessionFromThread(boolean participate, Object sessionFactory) {
- if (!participate) {
- SessionHolder sessionHolder = (SessionHolder)TransactionSynchronizationManager.unbindResource(sessionFactory);
- SessionFactoryUtils.closeSession(sessionHolder.getSession());
- }
- }
事务边界则由aop或者Transactional标记来控制,示例代码只是保证具备事务性的方法在需要的时候能从当前线程中获得session对象。
上述代码大部分截取自Spring的OpenSessionInViewFilter。
相关推荐
No Hibernate Session bound to thread,没有绑定线程解决办法,找了好久才找到的
解决多线程编程中的同步互斥问题
java多线程并发控制通信,用hibernate存储信息,数据库mysql.
多线程同步解决卖票问题
C# 多线程界面假死解决,正确使用多线程 C# 多线程界面假死解决,正确使用多线程 C# 多线程界面假死解决,正确使用多线程 C# 多线程界面假死解决,正确使用多线程 C# 多线程界面假死解决,正确使用多线程 没分的朋友...
C#多线程解决界面卡死问题的完美解决方案,简化了之前的写法,更容易记住和理解 C#多线程解决界面卡死问题的完美解决方案,简化了之前的写法,更容易记住和理解
e: 使用关键段解决子线程互斥问题 f: 利用事件实现线程同步问题 g: 利用互斥量来解决线程同步互斥问题 h: problem1 生产者消费者问题 (1生产者 1消费者 1缓冲区) problem1 more 生产者消费者问题 (1生产者 2...
NULL 博文链接:https://364232252.iteye.com/blog/2369000
java多线程的使用方法如何使用,怎么使用,使用过程中有什么要注意的
并发危险 [解决多线程代码中的 11 个常见的问题]。这是国外大公司开发人员必读的一份资料
C#多线程解决界面卡死问题的完美解决方案
C#.NET多线程实例6个(包括多线程基本使用,多线程互斥等全部多线程使用实例),可直接运行
用多线程同步方法解决读者阅览问题 用多线程同步方法解决读者阅览问题
1.资源简介:PyQt5中使用多线程模块QThread解决了PyQt5界面程序执行比较耗时操作时,程序卡顿出现的无响应以及界面输出无法实时显示的问题,采用线程池ThreadPoolExecutor解决了ping多个IP多任务耗时问题。...
线程问题解决线程问题解决线程问题解决线程问题解决线程问题解决
C#.NET多线程实例6个(包括多线程基本使用,多线程互斥等全部多线程使用实例)
qt 使用QWebSocket 创建websocket客户端来读取数据,异步链接,并且放入到线程中去执行,线程池的基础,代码使用两个用户,放入到一个线程中执行,同理,可以多个用户放入到多个线程中执行,为线程池执行websocket ...
利用VB多线程. 解决VB没有多线程的问题利用VB多线程. 解决VB没有多线程的问题利用VB多线程. 解决VB没有多线程的问题
C# 高效线程安全,解决多线程写txt日志类