记一次bug思考过程:HibernateException: Could not obtain transaction-synchronized Session for current thread
2024-08-26 11:12:06
场景:把从客户端提交的任务放到线程池执行
异常:HibernateException: Could not obtain transaction-synchronized Session for current thread
猜测:
根据关键词猜测可能的原因:
transaction、synchronized、session、current thread
由于这个操作是在Service中做的,又提到了事物、会话、当前线程,所以定位代码,发现是执行ADD操作报错
这块代码之前没有问题,在加了线程池执行后就报错了
由于service中默认是单实例的,所以下一步猜测:线程池的线程和客户端来的线程在执行数据库操作时有什么区别,
结论:
搜索了一些资料,对hibernate操作数据库有了一定的了解。
hibernate要对数据库操作必须有一个session,这个session不是http中的session,但概念类似。
正常执行add的请求(thread)中都会在ThreadLocal中存储sesssion,但由于线程池中的线程是我们创建出的,所以没有这个session
解决方案:
没有session,给个session就好了。
需要注意的就是判断当前线程有没有session
TransactionSynchronizationManager.isSynchronizationActive()这个方法可以判断,true代表当前现场有session
另外session用完需要关闭
最新文章
- MYSQL数据库的优化
- c#网络编程
- Orchard源码分析(4.4):Orchard.Caching.CacheModule类
- 7.js模式-装饰者模式
- HTML和JSON的数据交互-HTML模板
- document.compatMode(判断当前浏览器采用的渲染方式)
- android EncodingUtils
- CCNP路由实验(2) -- OSPF
- VMware vSphere 服务器虚拟化之二十二桌面虚拟化之创建View Composer链接克隆的虚拟桌面池
- NoSQL数据建模技术
- iOS 应用提交到iTunes Connect,显示";正在处理";后消失不见
- 【Swift 4.0】iOS 11 UICollectionView 长按拖拽删除崩溃的问题
- TopCoder Div2
- [Linux][Mac]如何使用SSH登陆远程Linux服务器&;使用SCP下载远程终端文件
- 声明父类new子类
- 【English】主语从句的引导词是如何选择?
- python中的find、rfind、index、rindex
- 设计一个 Java 程序,自定义异常类,从命令行(键盘)输入一个字符串,如果该字符串值为“XYZ”。。。
- 使用jstl报错:Can not find the tag library descriptor for “http://java.sun.com/jstl/core”
- OpenUDID 实现UDID替代