hibernate學習第三天筆記

一、對象的狀態

舉例: User user = new User();

Hibernate中對象的狀態有三種: 臨時/瞬時狀態 、 持久化狀態、遊離狀態

臨時狀態

特點: 01.直接new出來的對象; 02.不處於session的管理;03.數據庫中沒有對象的記錄;

持久化狀態

當調用session的save、saveOrUpdate/get/load/list等方法的時候,對象就是持久化狀態。

處於持久化狀態的對象,當對象的屬性進行更改的時候,會反映到數據庫中!

特點: 01.處於session的管理; 02.數據庫中有對應的記錄;

遊離狀態

特點: 01.不處於session的管理; 02.數據庫有對應的記錄; 03.是session關閉後,對象的狀態


二、 一級緩存

爲什麼要用緩存?

目的: 減少對數據庫的訪問次數!從而提升hibernate的執行效率!

Hibernate中緩存分類: 一級緩存 和 二級緩存。

概念

1) Hibernate中一級緩存,也叫session緩存,它可以在session範圍內減少數據庫的訪問次數! 只在session範圍有效!Session關閉,一級緩存失效!

2) 當調用session的save/saveOrUpdate/get/load/list/iterator 方法的時候,都會把對象放入session的緩存中。

3) session的緩存由hibernate維護,用戶不能操作緩存內容,如果想操作緩存內容,必須通過hibernate提供的evit/clear方法操作。

特點: 只在當前session範圍內有效,作用時間短,效果不是特別明顯! 在短時間內多次操作數據庫,效果比較明顯!


緩存相關幾個方法的作用

session.flush(); 讓一級緩存與數據庫同步
session.evict(); 清空一級緩存中指定的對象
session.clear(); 清空一級緩存中緩存的所有對象

什麼情況使用上面的方法:
       批量操作時候使用:
              Session.flush();//先與數據庫同步
              Session.clear();//再清空一級緩存


面試題1: 不同的session是否共享緩存數據?

       答: 不會,不同的session對象使用不同的緩衝區

面試題2: list與iterator查詢的區別?

       答: list()方法 : 會一次性把所有記錄都查出來,會放入緩存,但不會從緩存中獲取數據。

              iterator() 方法: 會執行N+1條查詢,N表示所有的記錄總數。 即會先發送一條語句查詢所有記錄的主鍵(1),再根據每一                                   個主鍵再去數據庫查詢(N)。會放入緩存,也會從緩存中獲取數據!


三、懶加載

面試題3: get、load方法的區別?

答:get:及時加載,只要調用get方法立即向數據庫查詢。 load:默認懶加載,用到數據的時候才向數據庫查詢


懶加載的概念: 當用到數據的時候纔想數據庫查詢,這就是hibernate的懶加載特性。

懶加載的目的: 提供程序執行效率!


配置可選值:

  • true : 使用懶加載
  • false: 關閉懶加載
  • extra: (在集合數據懶加載時候提升效率)在真正使用數據的時候才向數據庫發送查詢的sql;如果調用集合的size()/isEmpty()方法,只是統計,不是真正查詢數據!

懶加載異常:

  • session關閉後,不能使用懶加載數據!
  • 如果session關閉後,使用懶加載數據報錯:
            org.hibernate.LazyInitializationException: could not initialize proxy - no Session

如何解決session關閉後不能使用懶加載數據問題?

  • 方式一: 先使用一下數據: 如dept.getName();
  • 方式二: 強迫代理對象初始化: Hibernate.initialize(dept);
  • 方式三: 關閉懶加載: 設置 lazy = false;
  • 方式四: 在使用數據後,再關閉session。

四、hibernate對連接池的支持

連接池: 管理連接,提升連接的利用效率!

常用的連接池: c3p0連接池

Hibernate 自帶也有一個連接池,且對c3p0也有支持!


01. hibernate.properties文件查看連接池詳細配置:

  • hibernate.c3p0.max_size 2         最大連接數
  • hibernate.c3p0.min_size 2         最小連接數
  • hibernate.c3p0.timeout 5000          超時時間
  • hibernate.c3p0.max_statements 100         最大執行的命令的個數
  • hibernate.c3p0.idle_test_period 3000         空閒測試時間
  • hibernate.c3p0.acquire_increment 2         連接不夠用的時候, 每次增加的連接數

02. 告訴hibernate使用哪一個連接池技術:

hibernate.connection.provider_class org.hibernate.connection.C3P0ConnectionProvider

示例:

<!-- 【連接池配置】 -->
        <!-- 配置連接驅動管理類 -->
        <property name="hibernate.connection.provider_class">
            org.hibernate.connection.C3P0ConnectionProvider
        </property>
        <!-- 配置連接池參數信息 -->
        <property name="hibernate.c3p0.min_size">2</property>
        <property name="hibernate.c3p0.max_size">4</property>
        <property name="hibernate.c3p0.timeout">5000</property>
        <property name="hibernate.c3p0.max_statements">10</property>
        <property name="hibernate.c3p0.idle_test_period">30000</property>
        <property name="hibernate.c3p0.acquire_increment">2</property>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章