java多线程使用HibernateSession 时报 No session 的解决办法(转)
2015-06-16 10:50
501 查看
服务端新开多线程使用HibernateSession 杜绝No session
新起的线程需要绑定Hibernate session,才能在新线程中使用事务和延迟加载等功能,否则会曝出no session异常;解决办法:
[java] view plaincopy
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方法:
[java] view plaincopy
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方法
[java] view plaincopy
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。
相关文章推荐
- 【第四章】 资源 之 4.4 Resource通配符路径 ——跟我学spring3
- java多线程消息队列的实现
- 【第四章】 资源 之 4.3 访问Resource ——跟我学spring3
- 'org.springframework.orm.hibernate3.LocalSessionFactoryBean' not found解决方法
- eclipse中引入jar包问题
- 【第三章】 DI 之 3.4 Bean的作用域 ——跟我学spring3
- 【第三章】 DI 之 3.3 更多DI的知识 ——跟我学spring3
- 【第三章】 DI 之 3.2 循环依赖 ——跟我学spring3
- 【第三章】 DI 之 3.1 DI的配置使用 ——跟我学spring3
- 【第二章】 IoC 之 2.3 IoC的配置使用——跟我学Spring3
- 【第二章】 IoC 之 2.2 IoC 容器基本原理 ——跟我学Spring3
- 递归简论
- Java Thread join() 的用法
- Eclipse解决js报错
- Java并发编程笔记 使用阻塞队列实现生产者-消费者模型
- Java中String类的方法及说明,示例。
- java.lang.IllegalArgumentException: View not attached to window manager when dismissing dialog
- 在Eclipse中使用JUnit4进行单元测试(中级篇)
- eclipse提示:Syntax error on tokens, delete these tokens怎么解决
- android 开发环境搭建 eclipse支持,解决dl-ssl.google.com资源下载不动问题