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

  • 相关阅读:
    INS-30011 输入的ADMIN口令不符合Oracle建议的标准
    INS-30001 ADMIN口令为空
    INS-20802
    ORA-00922:选项缺失或无效
    struts2的配置文件
    Cache Fusion
    MQ配置模板
    RTSP流媒体数据传输的两种方式(TCP和UDP)
    ArcGIS For Flex报错二
    ArcGIS For Flex报错
  • 原文地址:https://www.cnblogs.com/woooodlin/p/13453405.html
Copyright © 2011-2022 走看看