多线程中使用HIBERNATE,解决NO SESSION 问题
2015-07-22 08:37
218 查看
本文转自网络:
新起的线程需要绑定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。
阅读更多相关文章推荐
- 使用Hibernate.initialize解决no session的延迟加载问题
- 使用Hibernate.initialize解决no session的延迟加载问题
- 解决使用HIBERNATE对ORACLE数据库中数据进行排序分页错乱的问题
- C#中使用多线程访问Winform问题解决方案
- C#中使用多线程访问Winform问题解决方案
- Hibernate使用property-ref属性解决遗留数据库One To Many关系的问题。
- spring hibernate mysql 使用中的问题及解决方法
- VB.net使用多线程与委托解决时间延迟的问题
- C#中使用多线程访问Winform问题解决方案
- Hibernate延迟加载 或 no session or session was closed 问题的解决(OpenSessionInViewFilter使用)
- c#中使用多线程访问winform中控件的若干问题 解决线程间操作无效: 从不是创建控件的线程访问它
- Spring使用OpenSessionInViewFilter解决Hibernate的lazy延时加载问题
- 使用Hibernate过程中所遇到的问题已经解决方法
- C#中使用多线程访问Winform问题解决方案
- C#中使用多线程访问Winform问题解决方案
- 在使用Hibernate时,因为一个查询需要更多的表连接而要使用SQL来解决性能问题。然而返回的结果集中包含了没有映射的Entity类中的表字段,在这个SQL中还有使用如何将层次关系的父子结点显示为横行
- 使用hibernate心得——字符串超长的解决办法(setCharacterStream出现顺序问题)
- 使用clone解决hibernate+spring集成中的延迟加载问题及分析(no session or session was closed)
- 使用ThreadLocal解决多线程的并发问题
- Hibernate数据的lazy问题,以及使用spring整合hibernate lazy的解决办法(好文转载)