iBatis(MyBatis)开启缓存后,通过外部程序修改或者删除数据库记录,如何让Cache清除?

当其外部的数据库连接甚至是数据库管理系统,对数据库进行了更改,iBatis(MyBatis)的缓存如果没有过期,是不会对数据库的修改做出相应的?这一点有什么好的解决方案?

再简单的描述一下(假设数据库系统为MySQL),例如有一个Java的应用持久层框架是使用iBatis(MyBatis)有一个每个500ms(毫秒)调用一次对数据库中ID为100的记录进行 select 操作,由于缓存的时间很长,此时有一个外部程序,假设此程序为一个C/C++程序通过mysql C API 连接到当前数据库(和java应用程序同一个数据库)它将ID为100的记录删除了。然而此时java应用中每个500ms对此记录进行select 操作依然有效!这个很郁闷,iBatis(MyBatis)的缓存有什么选项能够对外部数据库连接对记录进行修改或者删除能让iBatis(MyBatis)主动清除缓存?

MyBatis中没有这个机制。
MyBatis二级缓存工作原理是所有针对数据源的CRUD操作都先经过
缓存处理,对于查询操作,如果能正好命中缓存中的数据,直接从
缓存中返回,减少和数据库的IO操作来提高性能,否则查询数据库
将数据加入缓存再返回。对于增删改,修改数据库以后在返回之前
同时修改缓存。
如果从外部不经过缓存直接修改数据,那么肯定缓存中的数据和
真实数据会不一致。
如果一定有这个需求,可以在系统中对外提供数据增、删、改的服务;
或者当外部修改数据后,向系统发送通知,系统再刷新缓存。

没办法

缓存本只改用于那些较少更改或者脏数据对应用影响不大的地方

如果需要数据库中实时的数据,那么就不适合用缓存了

你这个得改变缓存策略,既然有外部影响,不能光靠mybatis自身的缓存了,你自己可以实现应用一层的缓存比较好点,也不难,无非就是存对象取对象了。