標籤:
本部落格的目的:①總結自己的學習過程,相當於學習筆記 ②將自己的經驗分享給大家,相互學習,互相交流,不可商用內容難免出現問題,歡迎指正,交流,探討,可以留言,也可以通過以下方式聯絡。本人互連網技術愛好者,互連網技術發燒友微博:伊直都在0221QQ:951226918
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1.Session 概述
1)Session 介面是 Hibernate 嚮應用程式提供的操縱資料庫的最主要的介面, 它提供了基本的儲存, 更新, 刪除和載入 Java 對象的方法.
2)Session 具有一個緩衝, 位於緩衝中的對象稱為持久化對象, 它和資料庫中的相關記錄對應. Session 能夠在某些時間點, 按照緩衝中對象的變化來執行相關的 SQL 陳述式, 來同步更新資料庫, 這一過程被稱為重新整理緩衝(flush)
3)站在持久化的角度, Hibernate 把對象分為 4 種狀態: 持久化狀態, 臨時狀態, 游離狀態, 刪除狀態. Session 的特定方法能使對象從一個狀態轉換到另一個狀態.
2.Session 緩衝
1)在 Session 介面的實現中包含一系列的 Java 集合, 這些 Java 集合構成了 Session 緩衝. 只要 Session 執行個體沒有結束生命週期, 且沒有清理緩衝,則存放在它緩衝中的對象也不會結束生命週期
2)Session 緩衝可減少 Hibernate 應用程式訪問資料庫的頻率。
3) 關於session 緩衝的操作
flush 緩衝
① flush:Session 按照緩衝中對象的屬性變化來同步更新資料庫
② 預設情況下 Session 在以下時間點重新整理緩衝:
顯式調用 Session 的 flush() 方法
當應用程式調用 Transaction 的 commit()方法的時, 該方法 先 flush ,然後在向資料庫提交事務
當應用程式執行一些查詢(HQL, Criteria)操作時,如果緩衝中持久化對象的屬性已經發生了變化,會先 flush 緩衝,以保證查詢結果能夠反映持久化對象的最新狀態
③ flush 緩衝的例外情況: 如果對象使用 native 產生器產生 OID, 那麼當調用 Session 的 save() 方法儲存對象時, 會立即執行向資料庫插入該實體的 insert 語句.
④ commit() 和 flush() 方法的區別:flush 執行一系列 sql 語句,但不提交事務;commit 方法先調用flush() 方法,然後提交事務. 意味著提交事務意味著對資料庫操作永久儲存下來。
瞭解:設定重新整理緩衝的時間點:
若希望改變 flush 的預設時間點, 可以通過 Session 的 setFlushMode() 方法顯式設定 flush 的時間點
reflesh(): 強制使緩衝中的某一個對象的狀態和資料庫的記錄一致。強制發送select語句,以使session緩衝中對象的狀態和資料表中對應的記錄一致
clear():清理緩衝
4) 資料庫的隔離等級
① 資料庫的隔離等級:對於同時啟動並執行多個事務, 當這些事務訪問資料庫中相同的資料時, 如果沒有採取必要的隔離機制, 就會導致各種並發問題:
> 髒讀: 對於兩個事物 T1, T2, T1 讀取了已經被 T2 更新但還沒有被提交的欄位. 之後, 若 T2 復原, T1讀取的內容就是臨時且無效的.
> 不可重複讀取: 對於兩個事物 T1, T2, T1 讀取了一個欄位, 然後 T2 更新了該欄位. 之後, T1再次讀取同一個欄位, 值就不同了.
> 幻讀: 對於兩個事物 T1, T2, T1 從一個表中讀取了一個欄位, 然後 T2 在該表中插入了一些新的行. 之後, 如果 T1 再次讀取同一個表, 就會多出幾行.
② 資料庫事務的隔離性: 資料庫系統必須具有隔離並發運行各個事務的能力, 使它們不會相互影響, 避免各種並發問題.
③ 一個事務與其他事務隔離的程度稱為隔離等級. 資料庫規定了多種交易隔離等級, 不同隔離等級對應不同的幹擾程度, 隔離等級越高, 資料一致性就越好, 但並發性越弱
④ 資料庫提供的 4 種交易隔離等級:
5) 在 MySql 中設定隔離等級
① 每啟動一個 mysql 程式, 就會獲得一個單獨的資料庫連接. 每個資料庫連接都有一個全域變數 @@tx_isolation, 表示當前的交易隔離等級. MySQL 預設的隔離等級為 Repeatable Read
② 查看當前的隔離等級: SELECT @@tx_isolation;
③ 設定當前 mySQL 串連的隔離等級: set transaction isolation level read committed;
④ 設定資料庫系統的全域的隔離等級: set global transaction isolation level read committed;
6)在 Hibernate 中設定隔離等級
① JDBC 資料庫連接使用資料庫系統預設的隔離等級. 在 Hibernate 的設定檔中可以顯式的設定隔離等級. 每一個隔離等級都對應一個整數:
1. READ UNCOMMITED
2. READ COMMITED
4. REPEATABLE READ
8. SERIALIZEABLE
②Hibernate 通過為 Hibernate 對應檔指定 hibernate.connection.isolation 屬性來設定事務的隔離等級
[原創]java WEB學習筆記78:Hibernate學習之路---session概述,session緩衝(hibernate 一級緩衝),資料庫的隔離等級,在 MySql 中設定隔離等級,在 Hibernate 中設定隔離等級