2016-01-13 34 views
1

我使用MyBatis和通过在xml映射器文件中激活的二级缓存。在外部冲洗MyBatis缓存(在映射器外部)

假设我想与从MyBatis分离的底层DB/DataSource进行交互,例如通过直接jdbcTemplate进行交互。

我该如何保证MyBatis缓存在适当的时候被刷新,当我通过jdbcTemplate在表上插入/更新/删除时,MyBatis会保存缓存的查询结果。

换句话说,我如何强制MyBatis从MyBatis映射器的外部缓存某个缓存命名空间的缓存?

我知道@Options(flushCache=true)注释,但这似乎不适用于映射器接口之外。

回答

3

您可以从配置获取缓存,然后通过命名空间获取并清除它。

@Resource 
    SqlSessionFactory sqlSessionFactory; 

    public void clearCacheByNamespace(){ 
     Configuration config = sqlSessionFactory.getConfiguration(); 
     Cache cache = config.getCache("com.persia.dao.UserInfoMapper"); 
     if(cache != null){ 
      cache.clear(); 
     } 
    } 
+0

没有帮助,问题是MyBatis的映射器 –

+1

我更新之外答案是,你可以通过从配置获取缓存来完成。 – Persia

0

嗨我使用了另一种方法,因为我们使用了spring。使用自动装配会话执行,并调用相应的方法

public class SomeServerClass{ 

    @Autowired 
    private org.mybatis.spring.SqlSessionTemplate sqlSessionTemplate; 

    private void someClearMethod(){ 
     sqlSessionTemplate.clearCache(); 
    } 
} 

如果我使用的界面org.apache.ibatis.session.SqlSession它指的是同一个实例

+0

由于SqlSessionTemplate.clearCache()的JavaDoc状态为“清除本地会话缓存”,因此我认为这将清除本地(每线程)缓存而不是独立于全局会话的缓存 –