2011-09-07 71 views
1

經過多年爲Websphere平臺開發Web應用程序,我最近一直在關注OSGi,特別是與RAP(RichAjayPlatform)項目有關的項目。如何在OSGi包中設置連接池?

在過去,我已經能夠使用JNDI查找訪問在EAR中定義的連接池。

如何創建連接池並在OSGi環境中訪問它們?我創建了一個包含jdbc驅動程序的DB2包,但我不確定如何創建該池。以前,這是EAR和Websphere中的配置。

有沒有任何例子,教程呢?

+1

您是否期望部署到WebSphere Application Server?如果是的話,所有的數據源都可以在服務註冊表中找到。您可以使用javax.sql.DataSource接口類型查找它們,並使用osgi.jndi.service.name服務屬性,該屬性將設置爲全局jndi中對象的名稱。 – Alasdair

+0

@Alasdair - 謝謝!是的,該應用程序將部署到WAS。我應該使用WAS安裝構建目標定義,以便測試嗎?或者你會建議什麼? 順便說一句 - 你的評論真的是一個答案。我想你應該把它複製到一個新的答案! – paul

回答

9

當然,OSGi沒有任何「內置」的連接池,但實現起來非常簡單。

首先,您的客戶端代碼應該通過服務訪問數據庫,可能類型爲javax.sql.DataSource(我建議使用Declarative Services將其注入到組件中)。

然後,您需要一個包將使用特定驅動程序創建連接池並註冊DataSource服務。我也會使用聲明式服務構建這個包裝Apache Commons DBCP庫。

+0

這是我設置JPA時所採用的方法。 OpenJPA中的DriverDataSource非常適合基於驅動程序創建數據源。 – Carl

+1

有沒有任何示例代碼如何與dbcp做到這一點?我找到了org.apache.commons.dbcp.PoolingDataSource,這可能是我們想要註冊爲OSGi服務的。在OSGi之外還有一個例子http://svn.apache.org/viewvc/commons/proper/dbcp/trunk/doc/PoolingDataSourceExample.java?view=markup –

1

您必須將連接池管理器註冊爲OSGi服務。如果添加Apache Aries JNDI包,則所有服務也將通過JNDI公開。由於類加載器問題,一些連接池管理器在OSGi中表現不佳,但將驅動程序嵌入到配置連接池的同一捆綁包中通常可以解決這些問題。

我只設置此使用JPA + JNDI,但我會採取與創建和導出一個連接池的步驟是這樣的:

  1. 手動創建一個連接池(C3P0,二溴氯丙烷,等)在捆綁激活器。
  2. 將連接池註冊爲捆綁上下文的服務。
  3. 在需要連接的服務中,獲取對連接池的引用(我使用聲明式服務),並從池中獲取連接。