![](https://cdn.zimug.com/wx-zimug.png) 最近已经路由有同学们反应这个系统已经在所在单位的生产上使用了,字母哥表示很欣慰,虽然不敢说一点bug都没有,但是我也是经过多轮测试了,期待大家如果遇到问题,能将问题反馈上来,让这个系统越来越好用。 ## 一、关于Closing non transactional SqlSession 有的朋友在群里发了这样一个问题 ![](https://img.kancloud.cn/1d/d3/1dd334c4b00ac5b301f1e53777f6fe01_432x212.png) 问题的日志是下面这样的 ~~~ Creating a new SqlSession SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@6a1e2abf] was not registered for synchronization because synchronization is not active JDBC Connection [HikariProxyConnection@881723065 wrapping com.mysql.cj.jdbc.ConnectionImpl@171f8b36] will not be managed by Spring Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@6a1e2abf] ~~~ 这个问题从日志看上去还挺吓人的(但是这是正常的,且听下文),大家看到上面的日志可能会想到这样几个问题: * `Creating a new SqlSession `每次请求都创建新的数据库连接?没有性能问题么? * `will not be managed by Spring`数据库连接没有被Spring 事务管理? * `Closing non transactional SqlSession `没有事务配置? 我给大家解释一下,上面的日志都是正常的,下面的日志是我把日志输出级别放宽之后的输出,多出来几行日志我们再看。 ~~~ Creating a new SqlSession SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2321e482] was not registered for synchronization because synchronization is not active 2020-10-31 06:52:29 [main] DEBUG o.s.j.d.DataSourceUtils - Fetching JDBC Connection from DataSource JDBC Connection [HikariProxyConnection@1797578199 wrapping com.mysql.cj.jdbc.ConnectionImpl@a85644c] will not be managed by Spring 2020-10-31 06:52:29 [main] DEBUG c.z.d.p.s.m.S.selectList - ==> Preparing: SELECT id,param_name,param_key,param_value,param_desc,create_time FROM sys_config 2020-10-31 06:52:29 [main] DEBUG c.z.d.p.s.m.S.selectList - ==> Parameters: 2020-10-31 06:52:29 [main] DEBUG c.z.d.p.s.m.S.selectList - <== Total: 1 Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2321e482] ~~~ * 每次请求都创建新的数据库链接么? 当然不是,项目使用的是[Hikari连接池,看清楚日志create a new SqlSession,不是Connection。而且日志级别放宽后,明确的输出:Fetching JDBC Connection from DataSource 所以JDBC 连接是从数据库连接池数据源里面获取的,不是每次都创建。 * 没有进行Spring 的事务管理?的确是在这次查询的时候没有进行Spring 事务管理,因为没有必要啊。看上面的日志我们只是去数据库里面进行一次select操作,我们要Spring 事务做什么?当然没有对这个查询SQL开启事务的必要。 * 事务怎么开启?使用`@Transactional`,哪里需要加哪里。不需要事务的地方不用加,查询SQL需要加事务么?当然不需要,这不是问题。