zoukankan      html  css  js  c++  java
  • 记一次bug思考过程:HibernateException: Could not obtain transaction-synchronized Session for current thread

    场景:把从客户端提交的任务放到线程池执行

    异常: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用完需要关闭

  • 相关阅读:
    51nod1089(最长回文子串之manacher算法)
    51nod1088(最长回文子串)
    51nod1256(乘法逆元)
    51nod1085(01背包)
    51nod1079(中国剩余定理)
    数据的特征工程
    30种提高mysql处理速度的方法
    机器学习资料
    python3.6安装-windows
    python import sklearn出错 "ImportError: DLL load failed: 找不到指定的模块。
  • 原文地址:https://www.cnblogs.com/woooodlin/p/13453405.html
Copyright © 2011-2022 走看看