2014-06-30 63 views
1
  1. 如果我將DataSource作爲OSGI中的服務公開,應該如何處理數據庫連接失敗?我應該配置一個DataSource服務的攔截器,它將捕獲數據庫連接失敗異常並取消註冊DataSource服務?或者OSGI容器會爲我處理異常?
  2. 我應該如何配置消費服務,以便它能夠在DataSource服務不可用的情況下生存下來,並允許用戶再次重新嘗試該事務?

回答

0

您應該像處理不使用OSGi時一樣處理意外的異常。

您應該使用連接池並將其註冊爲OSGi服務。它會爲你處理連接失敗。即使在使用該連接期間出現異常,您也必須始終關閉連接。 (在java 6之前的finally塊中,以及在java 7之後使用try-with-resources塊)。連接池通過實現DataSource接口來提供它們的功能。

有很多連接池。你可以爲他們谷歌。

我實現了兩個基於commons-dbcp的OSGi組件。一個用於彙集常規數據源,另一個用於彙集XADataSources。該組件選取原始DataSource/XADataSource OSGi服務,而不是註冊新的池化數據源OSGi服務。

您可以在這裏找到該模塊的源:https://github.com/everit-org/commons-dbcp-component

它可在Maven的中央位置:http://search.maven.org/#artifactdetails%7Corg.everit.osgi%7Corg.everit.osgi.jdbc.commons.dbcp%7C2.0.1%7Cbundle

下降罐子到您的OSGi容器後,你會看到的配置可能性WebConsole配置頁面上的組件(如果您有webconsole)。

+0

>>它會爲你處理連接失敗<<您是否在說OSGI容器將捕獲數據庫連接失敗異常並取消註冊DataSource服務? – isobretatel

+0

否。池數據源將按照您的配置進行操作。例如:它可以在提供任何連接之前運行檢查SQL,並在數據庫不可用時等待超時。即使數據庫不可用,DataSource服務仍保持註冊狀態。 –