我使用MyBatis 3.1.
当我需要绕过MyBatis本地缓存并直接命中数据库时,我有两个用例.
由于MyBatis配置文件只有全局设置,因此不适用于我的情况,因为我需要它作为例外,而不是默认情况. MyBatis的属性< select> XML语句似乎不包含此选项.
用例1:’从双重选择sysdate’.
MyBatis缓存导致此缓存始终在MyBatis会话中返回相同的值.当我尝试复制过时条目的情况时,这会导致我的集成测试出现问题.
我的解决方法是使用普通的JDBC调用.
用例2:从一个线程中“选择”并不总是看到另一个线程写入的值.
线程1:
SomeObject stored = dao.insertSomeObject(obj);
runInAnotherThread(stored.getId());
//complete and commit
线程2:
//'id' received as an argument provided to 'runInAnotherThread(...)'
SomeObject stored = dao.findById(id);
int count = 0;
while(stored == null && count < 300) {
++count;
Thread.sleep(1000);
stored = dao.findById(id);
}
if (stored == null) {
throw new MyException("There is no SomeObject with id="+id);
}
我偶尔会在服务器上收到MyException错误,但无法在我的本地计算机上重现.在所有情况下,对象始终在DB中.所以我猜错误取决于第一次存储的对象是否在MyBatis本地缓存中,等待5分钟没有帮助,因为它从不检查实际的数据库.
所以我的问题是如何在不退回普通JDBC的情况下解决MyBatis中的上述用例?
能够以某种方式告知MyBatis不在特定调用中使用缓存值(最好)或在特定查询的所有调用中将是首选选项,但我也会考虑任何解决方法.
第一个选项是在select上设置flushCache =“true”.这将在语句执行后清除缓存,以便下一个查询将命中数据库.
另一种选择是使用STATEMENT级本地缓存.默认情况下,在SESSION期间使用本地缓存(通常转换为事务).这由localCacheScope选项指定,并按会话工厂设置.因此,这将影响使用此mybatis会话工厂的所有查询.
原文地址:https://www.jb51.cc/spring/431950.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。