a、Hibernate的Session對象是非線程安全的, 對於單個請求,單個會話, 單個的工做單元(即單個事務,單個線程), 它一般只使用一次, 而後就丟棄。 若是一個Session 實例容許共享的話, 那些支持併發運行的, 例如Http request,session beans 將會致使出現資源爭用。 若是在Http Session中有hibernate的Session的話, 就可能會出現同步訪問Http Session。 只要用戶足夠快的點擊瀏覽器的「刷新」, 就會致使兩個併發運行的線程 使用同一個Session。 b、多個事務併發訪問同一塊資源, 可能會引起第一類丟失 更新, 髒讀, 幻讀, 不可重複讀, 第二類丟失更新一系列的問題。 解決方案:設置事務隔離級別。 Serializable:串行化。隔離級別最高 Repeatable Read:可重複讀 Read Committed:已提交數據讀 Read Uncommitted:未提交數據讀。隔離級別最差 設置鎖:樂觀鎖和悲觀鎖。 樂觀鎖:使用版本號或時間戳來檢測更新丟失, 在的映射中設置 optimistic-lock=」all」 能夠在沒有版本或者時間戳屬性 映射的狀況下實現 版本檢查, 此時Hibernate將比較一行記錄的每一個字段的狀態 行級悲觀鎖:Hibernate老是使用數據庫的鎖定機制, 從不在內存中鎖定對象! 只要爲JDBC鏈接指定一下隔 離級別, 而後讓數據庫去搞定一切就夠了。 類LockMode 定義了Hibernate所需的不一樣的鎖定級別: LockMode.UPGRADE, LockMode.UPGRADE_NOWAIT, LockMode.READ;
update()和saveOrUpdate()
是用來對跨Session的PO進行狀態管理的。
update()方法操做的對象必須是持久化了的對象。
也就是說,若是此對象在數據庫中不存在的話,
就不能使用update()方法。
saveOrUpdate()方法
操做的對象既能夠使持久化了的,
也能夠使沒有持久化的對象。
若是是持久化了的對象調用saveOrUpdate()
則會 更新數據庫中的對象;
若是是未持久化的對象使用此方法,
則save到數據庫中。
當對象由瞬時狀態(Transient)一save()時,
就變成了持久化狀態;
當咱們在Session裏存儲對象的時候,
實際是在Session的Map裏存了一份,
也就是它的緩存裏放了一份,
而後,又到數據庫裏存了一份,
在緩存裏這一份叫持久對象(Persistent)。
Session 一 Close()了,
它的緩存也都關閉了,
整個Session也就失效了,這個時候,
這個對象變成了遊離狀態(Detached),
但數據庫中仍是存在的。
當遊離狀態(Detached)update()時,
又變爲了持久狀態(Persistent)。
當持久狀態(Persistent)delete()時,
又變爲了瞬時狀態(Transient), 此時,
數據庫中沒有與之對應的記錄。
1當即檢索; 優勢: 對應用程序徹底透明, 無論對象處於持久化狀態, 仍是遊離狀態, 應用程序均可以方便的 從一個對象導航到與它關聯的對象; 缺點: 1.select語句太多; 2.可能會加載應用程序 不須要訪問的對象白白浪費許多內存空間; 2延遲檢索: 優勢: 由應用程序決定須要加載哪些對象, 能夠避免可執行多餘的select語句, 以及避免加載應用程序不須要訪問的對象。 所以能提升檢索性能, 而且能節省內存空間; 缺點: 應用程序若是但願訪問遊離狀態代理類實例, 必須保證他在持久化狀態時已經被初始化; 3 迫切左外鏈接檢索 優勢: 1對應用程序徹底透明, 無論對象處於持久化狀態, 仍是遊離狀態, 應用程序均可以方便地衝 一個對象導航到與它關聯的對象。 2使用了外鏈接, select語句數目少; 缺點: 1 可能會加載應用程序不須要訪問的對象, 白白浪費許多內存空間; 2複雜的數據庫錶鏈接也會影響檢索性能;
1.讀取並解析配置文件 2.讀取並解析映射信息,建立SessionFactory 3.打開Sesssion 4.建立事務Transation 5.持久化操做 6.提交事務 7.關閉Session 8.關閉SesstionFactory 爲何要用: 1. 對JDBC訪問數據庫的代碼作了封裝, 大大簡化了數據訪問層繁瑣的重複性代碼。 Hibernate是一個基於JDBC的主流持久化框架, 是一個優秀的ORM實現。 他很大程度的簡化DAO層的編碼工做 hibernate使用Java反射機制, 而不是字節碼加強程序來實現透明性。 hibernate的性能很是好, 由於它是個輕量級框架。 映射的靈活性很出色。 它支持各類關係數據庫, 從一對一到多對多的各類複雜關係。