У меня есть пакет OSGi, который должен сохранять данные в базе данных. Как описано in a previous stackoverflow question Я обнаружил, что для того, чтобы транзакции работали должным образом, мне нужно использовать XADataSource для подключения к базе данных. Однако, когда я это делаю, я вижу, что соединения с базой данных, открытые моим приложением, никогда не закрываются, что, конечно же, приводит к тому, что база данных не сможет принимать какие-либо подключения через некоторое время.Соединения DB, не закрывающиеся в OSGi
Моя установка заключается в следующем:
У меня есть пакет, который создает источник данных и который включает в себя только 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, используя Овен и OpenJPA за настойчивость, в то время как я также установил транзакции обертки сверток Aries (org.apache.aries.transaction.wrappers) для того, чтобы завербовать мои XA ресурсы с менеджер транзакций.
Любые идеи, что мне не хватает в моей конфигурации?
Edit: После некоторых поисков я еще нашел this DBCP issue что говорит о том, что проблема у меня есть ошибка в ДБХП с MySQL. Однако я не понимаю, как заменить DBCP на другую реализацию пула соединений, с которой может работать OpenJPA. Любые предложения более чем приветствуются.
Спасибо, Балаз. Я попробовал ваше предложение и, похоже, работает до сих пор. Как вы думаете, вы могли бы объяснить, почему эта конфигурация разрешает проблему? – Christina