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>
wrap
option 设置为 "yes"
,因为它是一个简单的 jar 文件。
所有这些包都被 karaf 正确加载。
现在我的问题是添加 PostgreSQL 驱动程序:我有postgresql-9.3-1102.jdbc41.jar
,它不是一个捆绑包(没有 manifest.mf 文件)。
我尝试过:
将其添加到类路径中 在bundles.xml
中使用<bundle wrap="no">postgresql-9.3-1102.jdbc41.jar</bundle>
包装它
使用 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 连接器的主要内容,如果未能解决你的问题,请参考以下文章