国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

擴展 Hibernate 對各類數據源支持

2019-11-18 15:40:15
字體:
來源:轉載
供稿:網友

  Hibernate內嵌了對C3P0,PRoxool,JNDI數據源等數據庫連接池的支持。
但當我們需要使用除了這幾個數據源外的其他數據源的時候就有問題了,例如我們需要用Apache的開源連接池項目DBCP,或者說我們想要使用多數JDBC驅動程序中自帶的XxxxDataSource時,Hibernate就沒有提供對這方面的支持。慶幸的是Hibernate做為一個強大的數據持久層組件,它在實現數據庫連接方面的擴展性也是非常強大的。本文將介紹兩種如何在Hibernate項目中使用自定義數據源的方法。

  本文假設你已經有Hibernate的開發經驗。

  在開始之前應該先明確你的項目中的具體情況,也就是確認Hibernate內嵌的組件是否真的無法支持你的應用需要。例如C3P0或者Proxool已經可以滿足大部分數據庫的需要,又或者你的數據源是在應用服務器中配置的,那么你也沒有必要進行擴展,你可以直接使用DatasourceConnectionProvider來讓Hibernate使用你所定義的數據源。

  那么什么時候你需要擴展Hibernate對數據源的支持呢?可能你永遠也用不上,但我一直在用。我用的原因可能不能成為正當的理由,因為C3P0或者Proxool總有些小地方的不足讓我不爽,個人更偏向于DBCP連接池。或許本文應該改名為《讓Hibernate支持DBCP數據源》,其實DBCP只不過是我的一個具體的例子,本文具有更普遍的應用意義。下面我們具體介紹兩種不同的擴展思路。

  思路一:使用外部定義數據源

  假設我們已經有了一個WEB項目,該項目采用了Struts框架,而且我們已經在Struts中配置了數據源,也有不少的代碼是依靠這個數據源運行的。現在我們需要給項目中加入對Hibernate的支持,但又不想去修改舊的已經成功穩定運行的代碼了。那我們該怎么辦?假如同樣在Hibernate配置一個數據源指到同一個數據庫,相信你也不樂意這樣干,因為一旦配置上有修改那么Struts和Hibernate的配置都需要修改,這個也只是麻煩一點而已,最要命的是沒法讓原有的代碼和Hibernate共用一個數據庫連接,因此事務處理也就無從談起。

  說那么多理由,無非就是為了讓Hibernate可以使用Struts中配置的數據源,而我們暫且不去考慮這是否是最好的解決方法。

  在Hibernate中有一個UserSuppliedConnectionProvider類,其實這個類什么也不干,你一旦讓它干點啥吧,它還凈出異常,搞得你很是惱火。在Hibernate中,這個類的含義是要求用戶自己來提供數據庫連接的獲取方法,同時當然也要自己負責關閉連接。

  為了使用Struts中配置的數據源,我們就不能直接調用sessionFactory.openSession()方法來獲取Session實例,因為你假如沒有在Hibernate中配置任何的數據庫連接,那Hibernate會默認讓UserSuppliedConnectionProvider類來跟你搗亂,你會收到很多異常信息,反復提醒我們必須自己提供數據庫連接!我們要做還是調用openSession方法,不同的是需要先從Struts的數據源中獲取數據庫連接,然后傳遞該連接給openSession方法(參照 SessionFactory.openSession(Connection) 方法)。

  下面是我寫的一個代碼片斷

//獲取Session實例
public Session getSession(){
 ServletContext contxt = ....
 SessionFactory sessions = ....

 DataSource ds = (DataSource)context.getAttribute(Globals.DATA_SOURCE_KEY);
 final Connection conn = ds.getConnection();
 return sessions.openSession(conn);
}

//釋放Session
public void closeSession(Session ssn){
 ssn.connection().close();
 ssn.close();
}
  需要提醒大家注重的是closeSession方法,在該方法中我們必須手工去關閉session對應的數據庫連接,我們前面已經提到了,UserSuppliedConnectionProvider類就是要求用戶自己提供數據庫連接已經連接的關閉。假如沒有調用ssn.connection().close()方法,這會導致Struts的數據源的連接沒有被釋放。

  同理,上面提到的Struts只是一個應用普遍的例子,實際中你可以使用任何的外部連接池,你只需要將獲取到的數據庫連接傳遞給openSession方法,并自行負責釋放數據庫連接即可。應該說這是一種最簡單的思路,好處是對系統的變動最小,兼容原來的代碼。

  思路二:擴展ConnectionProvider

  Hibernate本身是通過ConnectionProvider接口來實現治理數據庫連接的。例如其自帶的C3P0ConnectionProvider,ProxoolConnectionProvider等。

  在這個思路中,我們希望可以直接在Hibernate的配置文件中配置數據庫連接,也就是讓Hibernate獨攬數據庫的治理,真正做到各司其職。為了更了解該接口的使用,你不妨閱讀一下Hibernate提供的上面幾個類的源碼。

  接下來我們需要編寫一個實現了ConnectionProvider接口的類,要求這個類能支持任何的符合DataSource接口規范的數據源,同時在Hibernate的配置文件中進行參數的設定。首先我們假定我們的類名是DataSourceConnProvider,那我們的配置信息在hibernate.cfg.xml中看起來應該像下面一樣



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 济宁市| 兴业县| 台安县| 读书| 普洱| 桑植县| 台湾省| 阿拉善盟| 广灵县| 峡江县| 英山县| 山阳县| 新营市| 民乐县| 高要市| 平和县| 米泉市| 天全县| 肥城市| 景洪市| 兴安盟| 凤翔县| 乐陵市| 公安县| 平潭县| 元阳县| 原平市| 奉贤区| 马山县| 皮山县| 青铜峡市| 冀州市| 桃园县| 汝城县| 五原县| 紫云| 河西区| 敖汉旗| 富蕴县| 呼图壁县| 诏安县|