我使用MyBatis 3.1。
我有兩個用例,當我需要繞過MyBatis本地緩存並直接命中數據庫。
因爲MyBatis配置文件只有全局設置,所以它不適用於我的情況,因爲我需要它作爲例外,而不是默認設置。 MyBatis的屬性<select> XML語句似乎不包含此選項。
MyBatis:如何繞過本地緩存,並直接命中特定的數據庫
用例1:'select double from dual'。
MyBatis緩存會導致此問題在MyBatis會話中始終返回相同的值。當我嘗試複製過時條目的情況時,這會導致我的集成測試出現問題。
我的解決方法只是使用普通的JDBC調用。
用例2:從一個線程中'select'並不總是看到另一個線程寫入的值。
線程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錯誤,但我的本地機器上無法重現。在所有情況下,對象總是在數據庫中。所以我猜這個錯誤取決於第一次存儲的對象是否在MyBatis本地緩存中,等待5分鐘沒有幫助,因爲它從不檢查實際的數據庫。
所以我的問題是如何解決MyBatis中的上述用例,而不會回落到純JDBC?
只能以某種方式指示MyBatis不要在特定的調用中使用緩存的值(最好)或者在所有調用特定查詢的情況下都是首選,但我也會考慮任何解決方法。
的「flushCache =‘真’」的作品的確,謝謝,相信。正如你剛纔注意到的,第二種選擇是全球性的,所以我會避免它。 – Alexander 2014-10-21 13:15:53