(转)服务端新开多线程使用HibernateSession 杜绝No session

博主原文链接: https://blog.csdn.net/zhengwei223/article/details/30506455

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

解决办法:

//业务方法
new Runnable() {  
    @Override  
    public void run() {  
        //----------绑定session到当前线程------------  
        SessionFactory sessionFactory = (SessionFactory)applicationContext.getBean("sessionFactory");  
        boolean participate = ConcurrentUtil.bindHibernateSessionToThread(sessionFactory);  
        //---------你的业务---------------  
        //TODO 哈喽
        // ----------关闭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。

PS:以上内容转载自https://blog.csdn.net/zhengwei223/article/details/30506455

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值