项目使用springmvc+mybatis,容器使用的是weblogic。sysUserController为单例模式,web端有一个定时任务,需要定时刷新页面显示一些参数数据。
但是在运行中发现系统参数发生改变时,经常会跳回改变前的参数,经排查日志发现,是因为某些request在查询数据库时,并没有新建数据库连接,而是共用之前的sqlsession,从缓存中读取数据直接返回,但是也不是每次request都是直接从缓存中读取。日志如下:
重新创建数据库连接日志:
2021-07-19 17:48:00,148 DEBUG c.j.f.f.AuthFilter [[ACTIVE] ExecuteThread: '1' for queue: 'weblogic.kernel.Default (self-tuning)'] /fms_web/sysUserController/getParamById.action
2021-07-19 17:48:00,149 DEBUG c.j.f.f.AuthFilter [[ACTIVE] ExecuteThread: '1' for queue: 'weblogic.kernel.Default (self-tuning)'] /sysUserController/getParamById.action
2021-07-19 17:48:00,150 DEBUG o.m.s.SqlSessionUtils [[ACTIVE] ExecuteThread: '1' for queue: 'weblogic.kernel.Default (self-tuning)'] Creating a new SqlSession
2021-07-19 17:48:00,150 DEBUG o.m.s.SqlSessionUtils [[ACTIVE] ExecuteThread: '1' for queue: 'weblogic.kernel.Default (self-tuning)'] Registering transaction synchronization for SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@10415726]
2021-07-19 17:48:00,151 DEBUG o.m.s.t.SpringManagedTransaction [[ACTIVE] ExecuteThread: '1' for queue: 'weblogic.kernel.Default (self-tuning)'] JDBC Connection [jdbc:oracle:thin:@10.10.10.48:1521:XDDB, UserName=FMSPOC27, Oracle JDBC driver] will be managed by Spring
2021-07-19 17:48:00,152 DEBUG c.j.b.s.u.d.S.getSystemParam [[ACTIVE] ExecuteThread: '1' for queue: 'weblogic.kernel.Default (self-tuning)'] ==> Preparing: select * from sys_param
2021-07-19 17:48:00,152 DEBUG c.j.b.s.u.d.S.getSystemParam [[ACTIVE] ExecuteThread: '1' for queue: 'weblogic.kernel.Default (self-tuning)'] ==> Parameters:
2021-07-19 17:48:00,164 DEBUG c.j.b.s.u.d.S.getSystemParam [[ACTIVE] ExecuteThread: '1' for queue: 'weblogic.kernel.Default (self-tuning)'] <== Total: 132
2021-07-19 17:48:00,165 DEBUG o.m.s.SqlSessionUtils [[ACTIVE] ExecuteThread: '1' for queue: 'weblogic.kernel.Default (self-tuning)'] Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@10415726]
2021-07-19 17:48:00,165 DEBUG o.m.s.SqlSessionUtils [[ACTIVE] ExecuteThread: '1' for queue: 'weblogic.kernel.Default (self-tuning)'] Transaction synchronization committing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@10415726]
2021-07-19 17:48:00,166 DEBUG o.m.s.SqlSessionUtils [[ACTIVE] ExecuteThread: '1' for queue: 'weblogic.kernel.Default (self-tuning)'] Transaction synchronization deregistering SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@10415726]
2021-07-19 17:48:00,166 DEBUG o.m.s.SqlSessionUtils [[ACTIVE] ExecuteThread: '1' for queue: 'weblogic.kernel.Default (self-tuning)'] Transaction synchronization closing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@10415726]
使用原数据库连接日志
2021-07-19 17:48:11,533 DEBUG c.j.f.f.AuthFilter [[ACTIVE] ExecuteThread: '2' for queue: 'weblogic.kernel.Default (self-tuning)'] /fms_web/sysUserController/getParamById.action
2021-07-19 17:48:11,533 DEBUG c.j.f.f.AuthFilter [[ACTIVE] ExecuteThread: '2' for queue: 'weblogic.kernel.Default (self-tuning)'] /sysUserController/getParamById.action
2021-07-19 17:48:11,534 DEBUG o.m.s.SqlSessionUtils [[ACTIVE] ExecuteThread: '2' for queue: 'weblogic.kernel.Default (self-tuning)'] Fetched SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@704c52b7] from current transaction
2021-07-19 17:48:11,535 DEBUG o.m.s.SqlSessionUtils [[ACTIVE] ExecuteThread: '2' for queue: 'weblogic.kernel.Default (self-tuning)'] Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@704c52b7]
代码如下:
每次调用时先清空sqlsession,调用clearCache方法。
因为你类加了事务注解,会复用sqlsession,第二次查询直接走一级缓存了