J2EE框架之Hibernate

Hibernate的核心接口一共有5個,分別爲:Session、SessionFactory、Transaction、Query和Configuration。這5個核心接口在任何開發中都會用到。通過這些接口,不僅可以對持久化對象進行存取,還能夠進行事務控制。下面對這五個核心接口分別加以介紹。
  ·Session接口:Session接口負責執行被持久化對象的CRUD操作(CRUD的任務是完成與數據庫的交流,包含了很多常見的SQL語句。)。但需要注意的是Session對象是非線程安全的。同時,Hibernate的session不同於JSP應用中的HttpSession。這裏當使用session這個術語時,其實指的是Hibernate中的session,而以後會將HttpSesion對象稱爲用戶session。
  ·SessionFactory接口:SessionFactroy接口負責初始化Hibernate。它充當數據存儲源的代理,並負責創建Session對象。這裏用到了工廠模式。需要注意的是SessionFactory並不是輕量級的,因爲一般情況下,一個項目通常只需要一個SessionFactory就夠,當需要操作多個數據庫時,可以爲每個數據庫指定一個SessionFactory。
  ·Configuration接口:Configuration接口負責配置並啓動Hibernate,創建SessionFactory對象。在Hibernate的啓動的過程中,Configuration類的實例首先定位映射文檔位置、讀取配置,然後創建SessionFactory對象。
  ·Transaction接口:Transaction接口負責事務相關的操作。它是可選的,開發人員也可以設計編寫自己的底層事務處理代碼。

  ·Query和Criteria接口:Query和Criteria接口負責執行各種數據庫查詢。它可以使用HQL語言或SQL語句兩種表達方式。

 

Hibernate源碼中幾個包的作用簡要介紹

 

net.sf.hibernate.*  

  該包的類基本上都是接口類和異常類

  net.sf.hibernate.cache.*  

  JCS的實現類

  net.sf.hibernate.cfg.*  

  配置文件讀取類

  net.sf.hibernate.collection.*  

  Hibernate集合接口實現類,例如List,Set,Bag等等,Hibernate之所以要自行編寫集合接口實現類是爲了支持lazy loading

  net.sf.hibernate.connection.*  

  幾個數據庫連接池的Provider

  net.sf.hibernate.dialect.*  

  支持多種數據庫特性,每個Dialect實現類代表一種數據庫,描述了該數據庫支持的數據類型和其它特點,例如是否有AutoIncrement,是否有Sequence,是否有分頁sql等等

  net.sf.hibernate.eg.*  

  Hibernate文檔中用到的例子

  net.sf.hibernate.engine.*  

  這個包的類作用比較散

  net.sf.hibernate.expression_r.*  

  HQL支持的表達式

  net.sf.hibernate.hq.*  

  HQL實現

  net.sf.hibernate.id.*  

  ID生成器

  net.sf.hibernate.impl.*  

  最核心的包,一些重要接口的實現類,如果Session,SessionFactory,Query等

  net.sf.hibernate.jca.*  

  JCA支持,把Session包裝爲支持JCA的接口實現類

  net.sf.hibernate.jmx.*  

  我不懂JMX,只知道JMX是用來編寫App Server的管理程序的,大概是JMX部分接口的實現,使得App Server可以通過JMX接口管理Hibernate

  net.sf.hibernate.loader.*  

  也是很核心的包,主要是生成sql語句的

  net.sf.hibernate.lob.*  

  Blob和Clob支持

  net.sf.hibernate.mapping.*  

  hbm文件的屬性實現

  net.sf.hibernate.metadata.*  

  PO的Meta實現

  net.sf.hibernate.odmg.*  

  ODMG是一個ORM標準,這個包是ODMG標準的實現類

  net.sf.hibernate.persister.*  

  核心包,實現持久對象和表之間的映射

  net.sf.hibernate.proxy.*  

  Proxy和Lazy Loading支持

  net.sf.hibernate.ps.*  

  該包是PreparedStatment Cache

  net.sf.hibernate.sql.*  

  生成JDBC sql語句的包

  net.sf.hibernate.test.*  

  測試類,你可以用junit來測試Hibernate

  net.sf.hibernate.tool.hbm2ddl.*  

  用hbm配置文件生成DDL

  net.sf.hibernate.transaction.*  

  Hibernate Transaction實現類

  net.sf.hibernate.type.*  

  Hibernate中定義的持久對象的屬性的數據類型

  net.sf.hibernate.util.*  

  一些工具類,作用比較散

  net.sf.hibernate.xml.*  

  XML數據綁定

 

 

緩存管理

     1.Hibernate 中提供了兩級Cache,第一級別的緩存是Session級別的緩存,它是屬於事務範圍的緩存。這一級別的緩存由hibernate管理的,一般情況下無需進行干預;第二級別的緩存是SessionFactory級別的緩存,它是屬於進程範圍或羣集範圍的緩存。這一級別的緩存可以進行配置和更改,並且可以動態加載和卸載。 Hibernate還爲查詢結果提供了一個查詢緩存,它依賴於第二級緩存。

    2.一級緩存的管理: 當應用程序調用Session的save()、update()、savaeOrUpdate()、get()或load(),以及調用查詢接口的 list()、iterate()或filter()方法時,如果在Session緩存中還不存在相應的對象,Hibernate就會把該對象加入到第一級緩存中。當清理緩存時,Hibernate會根據緩存中對象的狀態變化來同步更新數據庫。 Session爲應用程序提供了兩個管理緩存的方法: evict(Object obj):從緩存中清除參數指定的持久化對象。 clear():清空緩存中所有持久化對象。

3. 二級緩存的管理:
  3.1. Hibernate的二級緩存策略的一般過程如下:
  1) 條件查詢的時候,總是發出一條select * from table_name where …. (選擇所有字段)這樣的SQL語句查詢數據庫,一次獲得所有的數據對象。
  2) 把獲得的所有數據對象根據ID放入到第二級緩存中。
  3) 當Hibernate根據ID訪問數據對象的時候,首先從Session一級緩存中查;查不到,如果配置了二級緩存,那麼從二級緩存中查;查不到,再查詢數據庫,把結果按照ID放入到緩存。
  4) 刪除、更新、增加數據的時候,同時更新緩存。
  Hibernate的二級緩存策略,是針對於ID查詢的緩存策略,對於條件查詢則毫無作用。爲此,Hibernate提供了針對條件查詢的Query Cache。
  3.2. 什麼樣的數據適合存放到第二級緩存中? 1 很少被修改的數據 2 不是很重要的數據,允許出現偶爾併發的數據 3 不會被併發訪問的數據 4 參考數據,指的是供應用參考的常量數據,它的實例數目有限,它的實例會被許多其他類的實例引用,實例極少或者從來不會被修改。
  3.3. 不適合存放到第二級緩存的數據? 1 經常被修改的數據 2 財務數據,絕對不允許出現併發 3 與其他應用共享的數據。
  3.4. 常用的緩存插件 Hibernater 的二級緩存是一個插件,下面是幾種常用的緩存插件:
  l EhCache:可作爲進程範圍的緩存,存放數據的物理介質可以是內存或硬盤,對Hibernate的查詢緩存提供了支持。
  l OSCache:可作爲進程範圍的緩存,存放數據的物理介質可以是內存或硬盤,提供了豐富的緩存數據過期策略,對Hibernate的查詢緩存提供了支持。
  l SwarmCache:可作爲羣集範圍內的緩存,但不支持Hibernate的查詢緩存。
  l JBossCache:可作爲羣集範圍內的緩存,支持事務型併發訪問策略,對Hibernate的查詢緩存提供了支持。
  3.5. 配置二級緩存的主要步驟:
  1) 選擇需要使用二級緩存的持久化類,設置它的命名緩存的併發訪問策略。這是最值得認真考慮的步驟。
  2) 選擇合適的緩存插件,然後編輯該插件的配置文件。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章