多线程中使用HIBERNATE,解决NO SESSION 问题
程序员文章站
2022-03-24 09:17:13
...
本文转自网络:
新起的线程需要绑定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。
上一篇: 利用堆栈做循环
下一篇: 关于 Node.js 之 Buffer
推荐阅读
-
使用vue-cli打包过程中的步骤以及问题的解决
-
web.py在SAE中的Session问题解决方法(使用mysql存储)
-
关于在vscode使用webpack指令显示"因为在此系统中禁止运行脚本"问题(完美解决)
-
Mysql5.7中使用group concat函数数据被截断的问题完美解决方法
-
使用ngrok+express解决本地环境中微信接口调试问题
-
倒计时cocos定时器schude使用的过程中 帧率浮动较大导致执行时机不准确的问题解决
-
vista和win7在windows服务中交互桌面权限问题解决方法:穿透Session 0 隔离
-
使用HTML5中postMessage知识点解决Ajax中POST跨域问题
-
ubuntu14.04 使用中遇到的问题及解决方法集锦
-
解决使用elementUI框架el-upload跨域上传时session丢失问题