精通Hibernate管理緩存
無論何時,我們在管理Hibernate緩存(Managing the caches)時,當你給save()、update()或saveOrUpdate()方法傳遞一個對象時,或使用load()、 get()、list()、iterate() 或scroll()方法獲得一個對象時, 該對象都將被加入到Session的內部緩存中。
當隨后flush()方法被調用時,對象的狀態會和數據庫取得同步。 如果你不希望此同步操作發生,或者你正處理大量對象、需要對有效管理內存時,你可以調用evict() 方法,從一級緩存中去掉這些對象及其集合。
- ScrollableResult cats = sess.createQuery("from Cat as cat").scroll(); //a huge result set
- while ( cats.next() ) {
- Cat cat = (Cat) cats.get(0);
- doSomethingWithACat(cat);
- sess.evict(cat);
- }
Session還提供了一個contains()方法,用來判斷某個實例是否處于當前session的緩存中。
如若要把所有的對象從session緩存中徹底清除,則需要調用Session.clear()。
對于二級緩存來說,在SessionFactory中定義了許多方法, 清除緩存中實例、整個類、集合實例或者整個集合。
- sessionFactory.evict(Cat.class, catId); //evict a particular Cat
- sessionFactory.evict(Cat.class); //evict all Cats
- sessionFactory.evictCollection("Cat.kittens", catId); //evict a particular collection of kittens
- sessionFactory.evictCollection("Cat.kittens"); //evict all kitten collections
CacheMode參數用于控制具體的Session如何與二級緩存進行交互。
CacheMode.NORMAL - 從二級緩存中讀、寫數據。
CacheMode.GET - 從二級緩存中讀取數據,僅在數據更新時對二級緩存寫數據。
CacheMode.PUT - 僅向二級緩存寫數據,但不從二級緩存中讀數據。
CacheMode.REFRESH - 僅向二級緩存寫數據,但不從二級緩存中讀數據。通過 hibernate.cache.use_minimal_puts的設置,強制二級緩存從數據庫中讀取數據,刷新Hibernate緩存內容。
如若需要查看二級緩存或查詢Hibernate緩存區域的內容,你可以使用統計(Statistics) API。
- Map cacheEntries = sessionFactory.getStatistics()
- .getSecondLevelCacheStatistics(regionName)
- .getEntries();
此時,你必須手工打開統計選項。可選的,你可以讓Hibernate更人工可讀的方式維護Hibernate緩存內容。
- hibernate.generate_statistics true
- hibernate.cache.use_structured_entries true
【編輯推薦】