從圖中可以看出:
sqlsession2去查詢使用者id為1的使用者資訊,去快取中找是否存在資料,如果存在直接從快取中取出資料。
明白了mybatis中二級快取的原理後,接下來就是如何使用二級快取了。在使用之前,首先得開啟二級快取的開關。
開啟了二級快取後,還需要將要快取的pojo實現serializable介面,為了將快取資料取出執行反序列化操作,因為二級快取資料儲存介質多種多樣,不一定只存在記憶體中,有可能存在硬碟中,如果我們要再取這個快取的話,就需要反序列化了。所以建議mybatis中的pojo都去實現serializable介面。下面以user為例截個圖:
我們先把sqlsession3部分注釋掉來測試一下二級快取的結果:
當我們把sqlsession3部分加上後,再測試一下二級快取結果:
到這裡,就明白了mybatis中二級快取的執行原理了,這個跟hibernate還是有點像的。
mybatis中還可以配置usecache和flushcache等配置項,usecache是用來設定是否禁用二級快取的,在statement中設定usecache=false可以禁用當前select語句的二級快取,即每次查詢都會發出sql去查詢,預設情況是true,即該sql使用二級快取。
一般下執行完commit操作都需要重新整理快取,flushcache=true表示重新整理快取,這樣可以避免資料庫髒讀。所以我們不用設定,預設即可,這裡只是提一下。
上面的部分主要總結了一下mybatis中二級快取的使用,但是mybatis中預設自帶的二級快取有個弊端,即無法實現分布式快取,什麼意思呢?就是說快取的資料在本地的伺服器上,假設現在有兩個伺服器a和b,使用者訪問的時候訪問了a伺服器,查詢後的快取就會放在a伺服器上,假設現在有個使用者訪問的是b伺服器,那麼,他在b伺服器上就無法獲取剛剛那個快取,如下圖所示:
所以我們為了解決這個問題,就得找乙個分布式的快取,專門用來儲存快取資料的,這樣不同的伺服器要快取資料都往它那裡存,取快取資料也從它那裡取,如下圖所示:
這樣就能解決上面所說的問題,為了提高系統併發效能、我們一般對系統進行上面這種分布式部署(集群部署方式),因此要使用分布式快取對快取資料進行集中管理。但是mybatis無法實現分布式快取,需要和其它分布式快取框架進行整合,這裡主要介紹ehcache。
上文一開始提到過,mybatis提供了乙個cache介面,如果要實現自己的快取邏輯,實現cache介面開發即可。mybatis也預設實現了乙個,但是這個快取的實現無法實現分布式快取,所以我們要自己來實現。ehcache分布式快取就可以,mybatis提供了乙個針對cache介面的ehcache實現類,這個類在mybatis和ehcache的整合包中。所以首先我們需要匯入整合包:
我們將該類的完全限定名寫到type屬性中即可,如下:
ok,配置完成,現在mybatis就會自動去執行這個ehcache實現類了,就不會使用自己預設的二級快取了,但是使用ehcache還有乙個快取配置別忘了,在classpath下新建乙個ehcache.xml檔案:
這裡面配置的作用跟hibernate差不多,大家可以去參考我那篇hibernate二級快取的博文。接下來就是測試了,還是用上面的那個測試程式,因為只改掉了快取,其他沒動。到此為止,mybatis的二級快取差不多就總結完了。 Mybatis之二級快取
mybatis預設對二級快取是關閉的,一級快取預設開啟 下面就說說為什麼使用二級快取需要注意 二級快取是建立在同乙個namespace下的,如果對錶的操作查詢可能有多個namespace,那麼得到的資料就是錯誤的。根據以上,想要使用二級快取時需要想好兩個問題 1 對該錶的操作與查詢都在同乙個name...
關閉二級快取 Mybatis一級快取 二級快取詳講
首先,我們先看一下這個標題 查詢快取 那就說明跟增 刪 改是沒有任何關聯的,只有在查詢時,才會遇到快取,增刪改不涉及!查詢快取目前mybatis中提供了兩個,分別是 一級快取 二級快取 所以,sqlsession的快取,是屬於一級快取 那,又有什麼用呢?比如,我們現在資料庫中有兩條資料,分別是張三跟...
MyBatis快取之二級快取 ehcache整合
二級快取允許手動管理 首先,二級快取可以跨session,只要在乙個sessionfactory範圍之內則允許跨session,但要想使用二級快取,需要手動進行配置 在 sqlmapconfig.xml 配置檔案中新增如下配置 包括之前的配置我一併貼上來了 也就是說,在mybatis框架中,只要是關...