mybatis 多次查詢快取的問題

2021-09-01 22:30:24 字數 1278 閱讀 2812

[size=medium] 最近在使用mybatis的過程中,發現乙個問題。如果在同乙個事物中,多次同乙個查詢sql在mybatis的執行過程中,只會查詢一次資料庫,後幾次所返回的物件是mybatis在在內部做了快取。[/size]

property property = this.findbypropertyid("123");

property.setpropertyid(null);;

property = this.findbypropertyid("123");

system.out.println(property.getpropertyid());

[size=medium]

以上的**,列印的結果為 null , 但是我們所期望的可能是 123 , 我不知道這是mybatis的乙個bug還是故意這樣去設計的.mybatis在執行查詢語句的時候,會在本地做乙份快取資訊.在baseexecutor類中:

[/size]

[size=medium]

可以看到在queryfromdatabase方法中,查詢資料庫返回結果之後,mybatis編制了乙個cachekey的物件,作為key,返回結果作為value,放入了快取當中[color=red](這個地方沒有使用拷貝的函式,所以只要外部修改了值,內部快取中的值資訊也會被修改)[/color]

之後再下次查詢的時候,會依據乙個判斷,是否需要執行快取資訊,同樣是在baseexecutor類中.

[/size]

[size=medium]

看到mybatis判斷了 ms.isflushcacherequired() 的返回資料,如果為 true 會執行 clearlocalcache 方法,清空快取資訊。如果快取中獲取不到的話,才會繼續去查詢資料庫。

可以從 list = resulthandler == null ? (list) localcache.getobject(key) : null; **中看出。

[color=red] 所以當第一次查詢放入快取之後,在外部修改了任何乙個值之後,mybatis內部快取的值也會被修改,而且下次查詢不會查詢資料庫,直接返回快取中被修改過的值[/color]

1.註解:註解的方式是通過 @options 註解中 flushcache 的配置

2.配置檔案:xml中每乙個select 都可以設定 flushcache 的屬性

[color=red]flushcache 設定成true之後,本sql的每次查詢都會清空快取後在執行。[/color]

[/size]

MyBatis查詢快取

一級快取 同乙個sqlsession物件,mybatis預設開啟一級快取。如果用同樣的sqlsession物件查詢相同的資料,則只會在第一次查詢時向資料庫傳送sql語句,並將查詢結果放入到sqlsession中 作為快取存在 後續再次查詢該同樣的物件時,則直接從快取中查詢該物件即可 即省略了資料庫的...

NSNotification多次執行的問題

本文主要講述在ios開發過程中,有關於nsnnotification的使用相關的問題,問題主要源於我在專案開發中,監聽鍵盤顯示和關閉的相關通知,發現通知方法會被多次執行,因為有很多地方會註冊這兩個通知,就會發現未顯示的介面,還是可以執行通知方法,這樣做明顯是沒有必要的,接下來就具體解釋怎麼解決這樣的...

mybatis的一級查詢快取

之所以需要查詢快取主要是為了提高查詢訪問速度,就是當使用者執行一次查詢後,會將該資料結果放到快取中,當下次再執行此查詢時就不會訪問資料庫了而是直接從快取中獲取該資料。如果在快取中找到了資料那叫做命中。在mybatis中有一級快取和二級快取兩種快取方式。當乙個 sqlsession 結束後,該 sql...