• 记一次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用完需要关闭

  • 相关阅读:
    java 基础知识学习 priorityQueue
    MySQL 学习三 关于转义
    java基础知识 学习 关于URL中传递的参数含有特殊字符
    MYSQL学习二 关于左连接
    大型网站架构体系的演变
    java 最佳实践
    Spring boot 学习 九
    七: git每次push都输入用户名,密码
    【JS】自学
    【CSS3】CSS3自学
  • 原文地址:https://www.cnblogs.com/woooodlin/p/13453405.html
Copyright © 2020-2023  润新知