檢測你數據庫連接的物理狀態
ZDNet China
/
/
URL:
創建連接
Java JDBC API各種類的一個基石是java
sql
Connection類
很多問題都同其復用
共用和驗證相關
對連接的驗證在實時的應用程序中尤其重要
因為它們必須無故障運行或者將故障率降至最低
事實上
在很多情況下都可能產生連接的丟失(例如
由於數據庫的崩潰或者由於某些網絡問題的存在)
不幸的是
標准的Java API並沒有提供任何方法來檢測連接的物理狀態
所以在每種特定的情況下都需要一種解決方法
現在讓我們來看看解決這個問題的兩種方法
第一種方法是使用軟件制造商專用的API
第二種方法是使用一種檢測
失敗查詢(test
fail query)的方法
創建連接
在使用任何SQL陳述式之前
應用程序必須要先連接到數據庫
建立連接的一種方法是使用java
sql工具包裡的連接工廠(connection factory)——DriverManager
getConnection()
但是
建立連接的首選方式是使用javax
sql
DataSource
getConnection()
你應該在對象每次請求進行連接的時候才使用這個工廠方法
而不是在創建了連接之後將這個連接保存在對象裡
下面是這個方法的一個例子
void foo(){
//
Connection conn = myDataSource
getConnection();
PreparedStatement ps = conn
prepareStatement(
);
//
}
此外
一個實現DataSource接口的類能夠使用命名服務來注冊
並使用JNDI API來訪問
DriverManager連接工廠和DataSource的巨大不同之處在於
DataSource能夠允許你控制連接的建立和使用
連接錯誤的問題
當你的應用程序嘗試使用一個已經同數據庫斷開的連接時
你會碰到一個像下面這樣的異常
java
sql
SQLException: Io exception: The Network Adapter could not establish the connection(lo異常
網絡適配器無法建立連接)
其結果是
你的SQL查詢會執行失敗
由於沒有哪個API能夠確定一個到數據庫的連接是否失效
因此你就只有在碰到SQL異常的時候才知道這個連接已經失效了
如果一個異常是同一個已斷開的連接相對應的
那麼你就必須要調整這個應用程序
這樣它才能夠嘗試重新建立連接
並重新執行查詢任務
很顯然
這種處理數據庫連接的混亂商務邏輯使得代碼更容易出錯
而且難以管理
信賴軟件制造商的API
信賴軟件制造商的API
處理連接斷開的一種方法是使用驅動程序專用的API
你可以使用這個API來建立到數據庫的連接
現在讓我們來看看Oracle的JDBC API
OracleConnectionCacheImpl這個類會實現javax
DataSource接口
並在你每次請求的時候驗證一下連接
此外
它還能夠通過緩沖隨後請求的連接來重復使用這個連接
換句話說
如果你關閉了數據庫
然後嘗試使用一個連接
你就會得到一個明確闡明了原因的SQL異常
看看Listing A
裡面有數據源用法的一個例子
驗證連接
另一個解決方案是你自己進行連接驗證
你可以編寫一個連接工廠
讓其將連接返回給請求者之前檢測連接的情況
將驗證機制從連接工廠裡抽象出來是一個很好的代碼編寫慣例
要實現這一目的
你就要應用GoF策略模式
它會引入一個負責進行連接驗證的接口
類圖表
Listing B裡的AbstractDataSource類提供了DataSource接口的基礎實現
這樣就為設置和訪問連接的屬性
包括JDBC驅動程序類
URL
用戶名和密碼
提供了便利的方法
這個類的確切實現有JdbcDataSource(Listing C)和ValidDataSource(Listing D)
Listing C裡的類為每個請求都創建了一個Connection對象
Listing E裡的類通過使用ConnectionValidator從而提供了連接驗證的能力
Listing F裡的SqlConnectionValidator是這個接口的簡單實現
在這個接口裡
一個快速的SQL查詢會被執行
以驗證你認為需要進行驗證的連接
你的這一目的是通過調用validateConnection(Connection conn)方法來實現的
它會在碰到任何連接問題的時候給出一個SQL異常
驗證的好處
無論你選擇使用哪種方法
建立一個有效的數據庫連接都是極其重要的
尤其是在處理關鍵的實時應用程序的時候
雖然定制連接驗證這種方式能夠為你提供更好的靈活性和API的獨立性
但是同使用軟件制造商所提供的API相比而言
它會降低整體的性能
你必須決定
增強可控制性所帶來的好處
同相應所增加的復雜性和代價相比是否值得
From:http://tw.wingwit.com/Article/program/Java/hx/201311/25802.html