-
现象
iBatis缓存刷新机制失效。
Spring提供了对iBatis的封装,在Spring3.0中,一般配置如下:
注意其中的mappingLocations属性,这样配置时,不需要在sql-map-config.xml中指定所有的sqlmap文件,Spring负责扫描、读取指定目录下所有符合条件classpath*:/com/**/model/sqlmap/*SqlMap.xml 的文件,达到简化配置的目的(增加/删除sqlmap文件不需要修改配置),在项目中按上述方法使用一切正常,但是使用iBatis自带缓存时,发现所有的 flushOnExecute 都没有起作用。
-
原因
Spring的封装改变了iBatis对配置文件的加载顺序,导致iBatis中的缓存刷新监听器注册失败。
正常情况下,执行 SqlMapConfigParser.parse() 时,在sql-map-config.xml中配置的SqlMap文件会首先被读取(包括其中对Cache的定义),所有文件读取完成后,会调用 SqlMapConfiguration.wireUpCacheModels() ,加载所有缓存:
Spring的封装中的相关代码:
-
-
解决
改成传统方式(删除mappingLocations,在sql-map.config.xml中配置所有SqlMap.xml文件后),问题解决。