我有一个 OSGi 包,它需要将数据保存在数据库中。如前一个 stackoverflow 问题中所述,我发现为了使事务按预期工作,我需要使用 XADataSource 连接到数据库。但是,当我这样做时,我看到我的应用程序打开的与数据库的连接永远不会关闭,这当然会导致数据库在一段时间后无法接受更多连接。
我的设置如下:
我有一个创建数据源的包,它只包含一个带有以下内容的 blueprint.xml 文件
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
<bean id="dataSource" class="com.mysql.jdbc.jdbc2.optional.MysqlDataSource">
<property name="url" value="jdbc:mysql://localhost:3306/myschema"/>
<property name="user" value="user"/>
<property name="password" value="pass"/>
</bean>
<service interface="javax.sql.XADataSource" ref="dataSource">
<service-properties>
<entry key="osgi.jndi.service.name" value="jdbc/mysqlds"/>
</service-properties>
</service>
</blueprint>
然后在持久化我的数据的包中,我有一个 persistence.xml
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="mypu" transaction-type="JTA">
<jta-data-source>osgi:service/javax.sql.DataSource/(osgi.jndi.service.name=jdbc/mysqlds)
</jta-data-source>
</persistence-unit>
</persistence>
我指定我的服务方法应该在我的 blueprint.xml 中的事务中运行
<bean id="MyServiceImpl"
class="com.test.impl.MyServiceImpl">
<jpa:context property="em" unitname="mypu" />
<tx:transaction method="*" value="Required" />
</bean>
<service id="MyService" ref="MyServiceImpl" interface="com.test.api.MyService" />
我在 Karaf 中通过捆绑包进行部署,使用 Aries 和 OpenJPA 进行持久化,同时我还部署了 Aries 事务包装捆绑包 (org.apache.aries.transaction.wrappers),以便通过事务管理器获取我的 XA 资源。
任何想法我在我的配置中缺少什么?
编辑: 经过更多搜索后,我发现了这个 DBCP 问题,这表明我遇到的问题是 MySQL 的 DBCP 错误。但是,我不知道如何用 OpenJPA 可以使用的其他一些连接池实现替换 DBCP。任何建议都非常受欢迎。