2011-09-07 75 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. 在需要连接的服务中,获取对连接池的引用(我使用声明式服务),并从池中获取连接。