SqlSession was not registered for synchronization because synchronization is not active问题的解决

SSM项目启动,控制台报了以下警告,

JDBC Connection XXX will not be managed by Spring和SqlSession was not registered for synchronization because synchronization is not active

意思是相关操作没有被事务管理起来,虽不影响项目功能正常使用,可每次启动看到这堆警告,导致强迫证又犯了,有一种非除之而后快件的冲动,于是检查配置文件中事务配置的部分,又上网搜索,经过一番测试,终于消除这些警告,下面是解决的过程。

在事务配置中我原先的代码:

1
2
3
4
5
6
7
8
9
10
11
<tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="delete*" propagation="REQUIRED" read-only="false"
                       rollback-for="java.lang.Exception"/>
            <tx:method name="insert*" propagation="REQUIRED" read-only="false"
                       rollback-for="java.lang.Exception" />
            <tx:method name="update*" propagation="REQUIRED" read-only="false"
                       rollback-for="java.lang.Exception" />
            <tx:method name="save*" propagation="REQUIRED" read-only="false"
                       rollback-for="java.lang.Exception" />
</tx:advice>

当时我的想法是只对数据操作中的增删改进行事务管理,查询就不管了,所以配置文件这里也只写了增删改的部分,然后控制台打印出来的警告都伴随在查询语句前面,因此,我上面的基础上增加以下查询管理部分:

1
2
3
<tx:method name="select*" propagation="SUPPORTS" read-only="true" />
<tx:method name="get*" propagation="SUPPORTS" read-only="true" />
<tx:method name="find*" propagation="SUPPORTS" read-only="true" />

因为我的查询方法基本上都是以select 或get、find开头的,如此就囊括了项目中所有查询方法。保存后启动项目,执行相应操作,终于不再提示以上警告了。

除此以外,还有一点需要注意是这里:

1
2
3
4
5
6
<!-- 3. 配置事务切点, 并把切点和事务属性关联起来 -->
    <aop:config>
        <aop:pointcut expression="execution(* com.klt.xll.*.service.impl.*.*(..))"
            id="txPointcut"/>                    
        <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>
    </aop:config>

这里必须与项目结构相吻合,如果不吻合,也会导致以上警告。

以上*中,第一个*表示所有返回值,com开始这部分是项目的包结构,注意要和第一个*号用空格隔开,第2个*号匹配项目中所有业务名,如employee,我是采用每一个业务逻辑包,里面包含bean/mapper/service/impl/controller的结构。这里必须配成与自己项目包结构一致。参照下图:

第3个*号匹配所有serviceImpl 类,第4个*号匹配serviceImpl 类里所有的方法,(..)匹配方法里所有的参数。

下面时作出如上改动后运行的控制台打印出来的提示:

1
2
3
4
5
Creating a new SqlSession
Registering transaction synchronization for SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@16d2b19]
JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@2ee05145] will be managed by Spring
ooo Using Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@2ee05145]
==>  Preparing: select id, action, data, user_id, ip, created from tb_logs order by created DESC limit 1, 5