1.為什麼使用緩存 hibernate使用緩存減少對資料庫的訪問次數,從而提升hibernate的執行效率。hibernate中有兩種類型的緩存:一級緩存和二級緩存。 2.一級緩存 Hibenate中一級緩存,也叫做session的緩存,當調用session的save/saveOrUpdate/ge ...
1.為什麼使用緩存
hibernate使用緩存減少對資料庫的訪問次數,從而提升hibernate的執行效率。hibernate中有兩種類型的緩存:一級緩存和二級緩存。
2.一級緩存
Hibenate中一級緩存,也叫做session的緩存,當調用session的save/saveOrUpdate/get/load/list/iterator方法的時候,都會把對象放入session的緩存中。
一級緩存可以在session範圍內減少資料庫的訪問次數,只在session範圍有效,session關閉,一級緩存失效。
session的緩存由hibernate維護, 用戶不能操作緩存內容; 如果想操作緩存內容,必須通過hibernate提供的evit/clear方法操作。
特點:
只在當前session範圍有效,作用時間短,效果不是特別明顯!
在短時間內多次操作資料庫,效果比較明顯!
list和iterator的區別
list:
一次把所有的記錄都查詢出來
會放入緩存,但不會從緩存中獲取數據
Iterator:
N+1查詢; N表示所有的記錄總數,即會先發送一條語句查詢所有記錄的主鍵(1),再根據每一個主鍵再去資料庫查詢(N)
會放入緩存,也會從緩存中取數據
public void test5()throws Exception{ Session session = sf.openSession(); session.beginTransaction(); User user = new User(); user.setUserName("林黛玉"); session.save(user); user.setUserName("嘉寶"); session.save(user); session.getTransaction().commit(); session.close(); }
由於一級緩存的作用,user對象只會被保存一次。
3.二級緩存
Hibernate提供了基於應用程式級別的緩存, 可以跨多個session,即不同的session都可以訪問緩存數據。 這個緩存也叫二級緩存。
Hibernate提供的二級緩存有預設的實現,且是一種可插配的緩存框架!如果用戶想用二級緩存,只需要在hibernate.cfg.xml中配置即可; 不想用,直接移除,不影響代碼。如果用戶覺得hibernate提供的框架框架不好用,自己可以換其他的緩存框架或自己實現緩存框架。
開啟二級緩存:
list() 預設情況只會放入緩存,不會從一級緩存中取,配置查詢緩存,可以讓list()查詢從二級緩存中取數據。
<!--開啟二級緩存--> <property name="hibernate.cache.use_second_level_cache">true</property> <!--指定使用的緩存框架--> <property name="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</property> <!--開啟查詢緩存--> <property name="hibernate.cache.use_query_cache">true</property>
指定需要二級緩存的類:
如果設置了集合緩存,集合所屬的元素對象也要放入二級緩存,即Employee。
<!--指定哪一些類需要加入二級緩存--> <class-cache class="com.juaner.department.Employee" usage="read-only"/> <class-cache class="com.juaner.department.Dept" usage="read-only"/> <!--集合緩存,集合所屬的類型也要放入二級緩存--> <collection-cache collection="com.juaner.department.Dept.emps" usage="read-only"/>
使用二級緩存:
如果設置了查詢緩存,需要手動設置setCacheable(true)。
@Test public void test1(){ Session session = sf.openSession(); session.beginTransaction(); //setCacheable 指定從二級緩存中找,或放入二級緩存,針對list不從一級緩存中取數據的情況 //從緩存中讀數據,查詢條件必須一致 //緩存機製為Map<條件,結果> Query query = session.createQuery("from Dept").setCacheable(true); System.out.println(query.list()); session.getTransaction().commit(); session.close(); Session session1 = sf.openSession(); session1.beginTransaction(); query = session1.createQuery("from Dept").setCacheable(true); System.out.println(query.list()); session1.getTransaction().commit(); session1.close(); }
4.get和load
get: 及時載入,只要調用get方法立刻向資料庫查詢
load:預設使用懶載入,當用到數據的時候才向資料庫查詢
5.懶載入
當用到數據的時候才向資料庫查詢,這就是hibernate的懶載入特性。
lazy 值
true 使用懶載入
false 關閉懶載入
extra 在集合數據懶載入時候提升效率,在真正使用數據的時候才向資料庫發送查詢的sql,如果調用集合的size()/isEmpty()方法,只是統計,不真正查詢數據!