OSGi 上的 PostgreSQL 连接器

Posted

技术标签:

【中文标题】OSGi 上的 PostgreSQL 连接器【英文标题】:PostgreSQL connector on OSGi 【发布时间】:2015-02-11 09:01:21 【问题描述】:

我正在使用 Karaf 开发一个 OSGi 应用程序。

此应用程序使用 Hibernate 4.3 连接到 postgresql 数据库。

当我使用休眠默认连接池时,我的应用程序可以工作,但 JBoss 建议不要在 prod 系统上使用它。所以我正在尝试使用 c3p0 连接池。

我使用以下捆绑包:

<bundle wrap="yes">hibernate-jpa-2.1-api-1.0.0.Final</bundle>
<bundle wrap="no">hibernate-core-4.3.7.Final</bundle>       
<bundle wrap="no">hibernate-entitymanager-4.3.7.Final</bundle>
<bundle wrap="no">hibernate-c3p0-4.3.7.Final</bundle>
<bundle wrap="no">hibernate-envers-4.3.7.Final</bundle>
<bundle wrap="no">hibernate-osgi-4.3.7.Final</bundle>

为了使用c3p0,我还添加了所需的第三方库:

<bundle wrap="yes">c3p0-0.9.2.1</bundle>

wrapoption 设置为 "yes",因为它是一个简单的 jar 文件。

所有这些包都被 karaf 正确加载。

现在我的问题是添加 PostgreSQL 驱动程序:我有postgresql-9.3-1102.jdbc41.jar,它不是一个捆绑包(没有 manifest.mf 文件)。

我尝试过:

将其添加到类路径中 在bundles.xml 中使用&lt;bundle wrap="no"&gt;postgresql-9.3-1102.jdbc41.jar&lt;/bundle&gt; 包装它 使用 this tutorial 将其包裹在 Eclipse 中 将其制成片段,由我的 dao 层包托管

但是没有任何效果。每次 c3p0 启动连接池时,当找到正确的驱动程序时,它都会失败并显示以下消息:

java.sql.SQLException: No suitable driver
    at java.sql.DriverManager.getDriver(DriverManager.java:278)[:1.7.0_67]
    at com.mchange.v2.c3p0.DriverManagerDataSource.driver(DriverManagerDataSource.java:240)[98:wrap_file_D_container_karaf_bundles_c3p0-0.9.2.1.jar:0]
    at com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:146)[98:wrap_file_D_trunk_container_karaf_bundles_c3p0-0.9.2.1.jar:0]

寻找这种问题,我发现有两个原因可能会附加:

hibernate.connection.url 可能有误。但这不是我的情况。我检查了很多次。 postgresql 驱动没有加载

在 OSGi 环境中使用 c3p0 和休眠有什么神奇的技巧吗?

【问题讨论】:

【参考方案1】:

Postgresql 现在提供了一个与 OSGi 兼容的驱动程序。可以从maven中心下载:mvn:org.postgresql/postgresql/9.4-1203-jdbc41 在 Apache karaf 中可以安装

feature:install pax-jdbc-postgresql

该包提供了一个作为 OSGi 的 DataSourceFactory。这可用于以编程方式创建 DataSource。

使用service:list 查看此DataSourceFactory 的属性。

或者,您可以使用 pax-jdbc-config 从使用 pax-jdbc-config 的配置创建数据源。使用osgi.jdbc.driver.class=org.postgresql.Driver 来识别配置中的 Postgresql 驱动程序。如果可以正确处理配置,则会有一个 DataSource 类型的服务,您可以在代码中引用它。

我得到了一个完整的example using derby and hibernate,应该很容易适应 postgresql。

【讨论】:

@cschneider 您可以使用ops4j1.jira.com/wiki/display/PAXJDBC/PostgreSQL+Driver+Adapter 的最新状态更新您的答案,因为 postgresql jdbc 现在是提供 DataSourceFactory 的有效 OSGi 包

以上是关于OSGi 上的 PostgreSQL 连接器的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 EclipseLink 使 PostgreSQL 与 OSGi 一起工作

eclipse如何连接postgreSQL??

Android上的Postgresql JDBC连接错误

Postgresql 内连接(尤其是自连接)上的多列优化

无法连接到端口 5432 上的 Postgresql

通过配置属性动态连接 OSGi 服务