• 分开的两个程序使用共同的mysql,一端更新了表,另一端怎么及时更新缓存,使用mybatis


        目前项目中由于业务系统和管理系统是分开的,管理端只负责对数据库表的CRUD,而业务系统也需要交互db。现在就存在一个问题,在管理端上改了某个表的值,业务端是无从得知的。因为业务端一直用相同的语句查询db,mybatis的二级缓存会缓存这些数据,不会真正发sql去查询真实数据。所以就需要管理端在修改表的时候,通知一下业务端是更新二级缓存,这样才能及时使用新值。

    起初在想mybatis的sqlSessionFactory有没有提供可以更新全局二级缓存的接口,发现真的没有。那就手动更新嘛~ ~ ~。方法是:

    首先我们的mapper是一个*Mapper.java加上*Mapper.xml,在.java中定义接口:

    @Repository
    public interface AppConfMapper {
        public List getBizConf(@Param("jobId") long jobId);
        public void refreshCache();
     }

    *Mapper.xml:

    
    	
    	
    	
            
            
            
                SELECT 1;
            
    

    是一个全局的配置,但在每个子元素是可以配置自身。

    (1)当为select语句时:

    flushCache默认为false,表示任何时候语句被调用,都不会去清空本地缓存和二级缓存。

    useCache默认为true,表示会将本条语句的结果进行二级缓存。

    (2)当为insert、update、delete语句时:

    flushCache默认为true,表示任何时候语句被调用,都会导致本地缓存和二级缓存被清空。

    useCache属性在该情况下没有。

    上面的信息我是从MyBatis官方文档中找到的,会发现当为select语句的时候,如果没有去配置flushCache、useCache,那么默认是启用缓存的。

        我们写一个refleshCache方法,在xml中用,但是不用写一条真正的update语句,用个select 1就行了,因为貌似mybatis只认标签的类型,而不是具体是什么语句,这里发现是,就会更新这个mapper中所有