Hibernate咱們已經學了四天,該講的知識咱們已經講完,明天放假,後天練習一天就要結束hibernate的學習,有點不捨的,想來hibernate也不是傳說中的那麼難,在次將hibernate中三個比較重要的概念在次總結一下。面試
hibernate存在2個緩存數據庫
* 第一級別的緩存是 Session 級別的緩存,它是屬於事務範圍的緩存(session的一級緩存)api
* 第二級別的緩存是 SessionFactory 級別的緩存,它是屬於進程範圍的緩存(二級緩存緩存
session的一級緩存session
* 使用hibernate進行查詢的時候,將查詢結果放置到session的一級緩存中,在一級緩存中存在對象,對象使用屬性的OID的值進行區分,此時再使用相同的OID進行查詢的時候,首先會在session一級緩存中進行查找是否存在相同的OID併發
* 若是存在相同的OID,此時再也不查詢數據庫,而是直接使用一級緩存中存在的對象ide
* 若是沒有存在相同的OID,此時再查詢數據庫,將查詢獲得的結果數據再放置到session一級緩存中學習
目的:減小訪問數據庫的次數spa
session的快照hibernate
* 使用id進行查詢數據庫,將查詢獲得的結果放置到session一級緩存中,同時複製一份數據,放置到session的快照中
* 當使用tr.commit()的時候,同時清理session的一級緩存(flush)
* 當清理session一級緩存的時候,會使用OID判斷一級緩存中對象和快照中的對象進行比對
* 若是2個對象(一級緩存的對象和快照的對象)中的屬性發生變化,則執行update語句,此時更新數據庫,更新成一級緩存中的數據
* 若是2個對象中的屬性不發生變化,此時不執行update語句
目的:確保和數據庫中的數據一致
Session二級緩存
二級緩存
一個可配置的緩存插件包括類級別的緩存區域,集合級別的緩存區域,查詢級別的緩存區域,時間戳級別的緩存區域
其使用步驟大體以下:
1 拷貝ehcache-1.5.0.jar到當前工程的lib目錄下
2 開啓二級緩存
<property name="hibernate.cache.use_second_level_cache">true</property>
3 要指定緩存的供應商
<property name="hibernate.cache.provider_class">
org.hibernate.cache.EhCacheProvider</property>
4 指定使用二級緩存的類
* 方法一 在使用類的*.hbm.xml配置
選擇須要使用二級緩存的持久化類, 設置它的二級緩存的併發訪問策略, <class> 元素的 cache 子元素代表 Hibernate 會緩存對象的簡單屬性, 但不會緩存集合屬性, 若但願緩存集合屬性中的元素, 必須在 <set> 元素中加入 <cache> 子元素
方法二 在hibernate.cfg.xml文件中配置(建議)
<!-- 指定使用二級緩存的類放在maping下面 -->
<!-- 配置類級別的二級緩存 -->
<class-cache class="cn.itcast.c3p0.Customer" usage="read-write"/>
<class-cache class="cn.itcast.c3p0.Order" usage="read-write"/>
<!-- 配置集合級別的二級緩存 -->
<collection-cache collection="cn.itcast.c3p0.Customer.orders"
usage="read-write"/>
• 5 配置ehcache默認的配置文件ehcache.xml(名字固定)(放在類路徑下)
上網看了下,說是hibernate中一級緩存、快照、二級緩存面試的時候問得比較多,感受老師講的很不透,因此本身總結了一下。