持久化/Session和SessionFactory線程非安全和安全/Hibernate的優點

javabean=pojojava

持久化:持久化是程序數據在瞬時狀態和持久狀態間轉換的過程數據庫

持久化之後就是pc
PO=POJO+xml 配置 他是普通的java對象緩存

直接用它來傳遞。傳遞過程當中就是DTO(Data Transefer Object)
直接用來對應表示層就是VO安全

 

SessionFactory重量級的,一個線程中只能有一個,而且是線程安全的。session每一個線程一份,線程非安全!
SessionFactory:線程安全,保存了當前數據庫配置信息和全部映射關係以及預約義的SQL語句。在SessionFactory中內會了鏈接池。
1.OpenSesion() --從鏈接池中隨意獲取一個鏈接。
2.getCurrentSession() --將Session和Threadlocal綁定,確保再一次請求中,只有一個Session對象
一般一個應用只會初始化一個SessionFactory(表明一個鏈接池)session

 

Hibernate的優點

l 優秀的Java 持久化層解決方案  (DAO)多線程

l 主流的對象—關係映射工具產品併發

l 簡化了JDBC 繁瑣的編碼框架

l 將數據庫的鏈接信息都存放在配置文件svn

l 本身的ORM框架工具

必定要手動實現Hibernate(模擬Hibernate實現)


Hibernate中的是session,不是http協議中的session。固然他也不是connection,初學者能夠當作是connection

Hibernate框架位於應用程序和數據庫之間,將數據庫底層操做徹底封裝。應用po對象進行Hibernate操做,完成對數據庫的操做。經常使用值是key 
和val

Hibernate核心配置
Configuration 配置文件加載工具
SessionFactory 鏈接池工廠
session 會話(至關於 Connection)
Transaction 事務(最複雜)
3.Session:表明鏈接,線程不安全。
對比ThreadLocal和synchronized同步機制
相同點:
 一、ThreadLocal和線程同步機制都能解決多線程中相同變量的訪問衝突問題。
不一樣點:
一、適用的狀況不一樣
 在同步機制中,使用同步保證同一時間只有一個線程訪問,不能同時訪問共享資源,不然就是出現錯誤。ThreadLocal則隔離了相關的資 
源,並在同一個線程中能夠共享這個資源。彼此獨立,修改不會影響到對方。
二、最終實現的效果不一樣
對於多線程資源共享問題,同步機制採用了「以時間換空間」的方式,而ThreadLocal採用了「以空間換時間」的方式。前者僅提供一份 
變量,讓不一樣的線程排隊訪問,然後者爲每個線程都提供了一份變量,所以能夠同時訪問而互不影響。
4.Transaction 表明事務
commit(); 提交事務,rollback(); 回滾事務
若是沒有開啓事務,那麼每一個Session的操做,都至關於一個獨立的事務

數據庫提供事務
解析:四個階段ACID
隔離性(兩個事務)
多併發問題
髒讀 不可重複 幻想讀 丟失更新問題 解決多線程併發:解決方式

事務隔離級別
Read-uncommited 讀未提交

丟失更新問題:
樂觀鎖:svn 數據庫保存版本號,程序更改版本號
悲觀鎖:
髒檢查:當事務提交時,Hiberante會對Session中持久狀態的對象進行檢測,判斷對象的數據是否發生了改變
依據:
爲何要進行髒檢查?
解析:若是對象發生了改變,就須要將改變動新到數據庫中,以確保內存中的對象與數據庫中的數據保持一致。
如何髒檢查?
  解析:當一個Dept對象被加入到Session緩存(有人又稱爲 一級緩存 後者是內部緩存)中時,Session會爲Dept對象的值類型的屬性複製一 
份快照。當Session刷新緩存時,會先進行髒檢查,即比較Dept對象的當前屬性與它的快照,來判斷Dept對象的屬性是否發生了變化。若是發生了 
變化,Session會根據髒對象的最新屬性值來執行相關的SQL語句,將變化更新到數據庫中。
Session具備一個緩存,能夠管理和跟蹤全部持久化對象,對象和數據庫中的相關記錄對應。
Session會在如下時間點刷新緩存
1)事務的commit()
2) session.flush()
S2 C# IO stream.flush(); 
一級緩存

更新數據的方法 update()方法saveOrUpdate()方法merge()方法

相關文章
相關標籤/搜索