Hibernate 和 快照

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中一級緩存、快照、二級緩存面試的時候問得比較多,感受老師講的很不透,因此本身總結了一下。

相關文章
相關標籤/搜索