一、對象的狀態
舉例: 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>