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

  • 相关阅读:
    Ajax原理实现
    EDP项目结构规范心得
    “引用的账户当前已锁定,切无法登录“问题解决方案
    实现文字背景不透明
    CSShack
    垂直居中重要方法理解---重点是方法三
    计算机为什么要区别C盘,D盘,E盘等?
    javascript典型实例
    centos7 安装telent和telnet-server
    使用xmanager连接linux服务器安装oracle数据库
  • 原文地址:https://www.cnblogs.com/woooodlin/p/13453405.html
Copyright © 2011-2022 走看看