> 技术文档 > SqlSession was not registered for synchronization because synchronization is not active

SqlSession was not registered for synchronization because synchronization is not active


1、报错日志

Creating a new SqlSessionSqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2d2a2fbb] was not registered for synchronization because synchronization is not activeJDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@3b7fcdde] will not be managed by Spring==> Preparing: SELECT id,account,password,nickname,bean,agent_id,begin_time,end_time,program_id,avatar,link,create_time,program_name,app_id,platform,ad_id,ad_account,is_pay,promoter,link_lasted,promoter_lasted,tag FROM sys_before_user WHERE id=?==> Parameters: 1867122329554010114(String)

SqlSession was not registered for synchronization because synchronization is not active

2、报错原因

这条日志信息包含了两个主要部分,每个部分都指出了在使用MyBatis和Spring框架集成时可能遇到的问题。下面是对这两个部分的解释和可能的解决方案:

SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@4506756f] was not registered for synchronization because synchronization is not active

这个信息说明MyBatis的SqlSession没有被注册到Spring的事务同步管理中。这通常发生在以下几种情况:

  1. 事务未正确开启:确保你的方法被Spring的事务管理器所管理。可以通过在方法上使用@Transactional注解来确保事务的开启。
  2. SqlSession的使用方式不正确:如果你是手动获取SqlSession(例如通过SqlSessionFactory),则可能需要在手动获取后立即注册到Spring的事务管理器中,但通常这不是推荐的做法。更好的是使用MyBatis-Spring集成提供的自动管理方式,比如通过Mapper接口。
JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@5c057ec7] will not be managed by Spring

这个信息指出Druid连接池提供的JDBC连接没有被Spring管理。这通常是因为:

  1. 连接池配置问题:确保你的Druid数据源被正确地配置为Spring的bean,并且Spring的事务管理器被配置为使用这个数据源。
  2. Spring配置缺失:检查你的Spring配置文件或Java配置,确保所有的数据源和事务管理器都被正确配置。

主要原因就是:Sqlsession未注册同步,同步注册未激活,JDBC connection不能被Spring所托管(eg:service实现类方法上未加@Transactional注解,从而导致地未同步注册)。

3、解决方法

  1. 确保所有涉及到数据库操作的方法都被@Transactional注解修饰,以便Spring能够管理事务(eg:在service实现类方法上加@Transactional注解,使得同步注册)。
  2. 使用MyBatis-Spring的Mapper接口来操作数据库,而不是直接操作SqlSession。Mapper接口能够自动地将SqlSession的获取和关闭以及事务的管理交给Spring来处理。
  3. 检查并更新你的Spring和MyBatis配置文件,确保所有相关的bean(如数据源、事务管理器等)都被正确配置。
  4. 如果你在使用Druid连接池,确保DruidDataSource被配置为Spring的bean,并且Spring的事务管理器配置了正确的数据源。
    通过这些步骤,你应该能够解决上述日志信息中提到的问题。如果问题仍然存在,可能需要更详细地检查你的应用配置和代码实现。

4、连续错误

多个以上提到的错误连续出现,有可能导致jar运行终止。这些错误通常涉及到事务管理、数据库连接以及MyBatis与Spring的集成问题,它们都是关键的系统组件,如果处理不当,很可能会引发严重的运行时异常,从而导致整个应用程序崩溃或停止运行。

具体来说,以下情况可能导致jar运行终止:

  1. 事务管理失败:如果事务没有正确开启或提交/回滚失败,可能会导致数据不一致或锁定问题,进而引发运行时异常。这些异常如果没有被捕获和处理,可能会导致应用程序崩溃。
  2. 数据库连接问题:如果数据库连接无法建立或连接池耗尽,应用程序将无法执行数据库操作。这可能会导致无法处理的异常,从而终止应用程序的运行。
  3. MyBatis与Spring集成问题:如果MyBatis和Spring的集成配置不正确,可能会导致SqlSession无法正确注册到Spring的事务同步管理中,或者JDBC连接无法被Spring管理。这些问题都可能引发运行时异常,导致应用程序崩溃。
  4. 资源耗尽:如果应用程序在处理这些错误时消耗了大量资源(如内存、CPU等),可能会导致资源耗尽,进而引发系统级别的异常,如OutOfMemoryError或StackOverflowError,这些异常也会导致应用程序终止。
  5. 未捕获的异常:如果应用程序中的代码没有适当地捕获和处理可能抛出的异常,那么这些异常可能会传播到应用程序的更高层,最终导致应用程序崩溃。