データベースにデータを保持する必要がある OSGi バンドルがあります。以前のスタックオーバーフローの質問で説明したように、トランザクションが期待どおりに機能するには、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" />
XA リソースをトランザクション マネージャーに登録するために、Aries と OpenJPA を使用して、Karaf にバンドルでデプロイします。
私の構成に欠けているものはありますか?
編集: さらに検索した後、このDBCPの問題が見つかりました。これは、私が抱えている問題がMySQLのDBCPのバグであることを示唆しています。ただし、DBCP を OpenJPA と連携できる他の接続プール実装に置き換える方法については途方に暮れています。どんな提案でも大歓迎です。