解决多线程中hibernate出现no session问题

来源:互联网 发布:伊藤绫子二宫和也 知乎 编辑:程序博客网 时间:2024/06/10 20:15

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

private class MyThread extends Thread {@Overridepublic void run() {while (true) {//绑定session到当前线程boolean participate = BackstageMgrApiImpl.bindHibernateSessionToThread(sessionFactory);//业务逻辑//关闭sessionBackstageMgrApiImpl.closeHibernateSessionFromThread(participate, sessionFactory);}}}// 关闭Sessionpublic static void closeHibernateSessionFromThread(boolean participate, Object sessionFactory) {if (!participate) {SessionHolder sessionHolder = (SessionHolder) TransactionSynchronizationManager.unbindResource(sessionFactory);SessionFactoryUtils.closeSession(sessionHolder.getSession());}}// 绑定Session到新的线程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;}


事务边界则由aop或者Transactional标记来控制,示例代码只是保证具备事务性的方法在需要的时候能从当前线程中获得session对象。

上述代码大部分截取自Spring的OpenSessionInViewFilter。





阅读全文
0 0