0

У меня есть пакет 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. Любые предложения более чем приветствуются.

ответ

1

Я использовал Викисклад ГСБД иметь пул соединений, которые также вербуют XA соединений со следующей конфигурацией:

<bean id="myXAEnabledConnectionPoolDataSource" class="org.apache.commons.dbcp.managed.BasicManagedDataSource" destroy-method="close"> 
    <property name="xaDataSourceInstance" ref="mysqlXADataSourceBean" /> 
    <property name="transactionManager" ref="transactionManager" /> 
</bean> 

Вы можете получить менеджер транзакций в качестве эталона на основе интерфейса javax.transaction.TransactionManager.

Таким образом commons-dbcp будет обрабатывать жизненный цикл соединений должным образом. Обратите внимание, что метод destroy существует, поэтому, когда контейнер чертежа остановится, пул соединений будет закрыт.

Edit:

1-2 года назад у меня была такая же проблема, но с PostgreSQL. В то время я много раз отлаживал aries.transaction.wrapper, но не могу точно вспомнить причину, по которой я ее оставил. Я думаю, что мотивация была в том, что commons-dbcp - это решение, которое работало для меня в предыдущих проектах, в то время как я не мог исправить aries.transaction.wrapper даже после анализа его кода.

Обратите внимание: MysqlDataSource не является пулом соединений. Он возвращает новое соединение всегда, когда вам это нужно. Он также не включен XA. MysqlXADatasource включен XA, поэтому вы должны, вероятно, создать экземпляр объекта из этого класса. Однако XADataSource несет ответственность только за то, чтобы вернуть XAConnections для вас, но не для их привлечения. Это может помочь ManagedConnectionPool.Управляемый пул соединений делают следующие:

  • Обертывания всех предоставленных объекты связи с пользовательским управляемыми соединениями класса
  • В случае закрытия вызываются соединение, оно не закрыт, если существует постоянная сделка. Он закрыт (добавляется обратно в пул) при совершении транзакции или откате
  • В случае запроса соединения из пула и соединения, которое также предоставляется в той же транзакции, будет возвращена та же транзакция (это было трудное предложение :))

Иногда драйверы JDBC предоставляют пулы соединений и даже управляемые пулы подключений, однако лучше использовать драйвер JDBC только для получения новых подключений и переноса его с помощью библиотеки 3rdparty, которая была тестируется в нескольких проектах и ​​работает точно.

+0

Спасибо, Балаз. Я попробовал ваше предложение и, похоже, работает до сих пор. Как вы думаете, вы могли бы объяснить, почему эта конфигурация разрешает проблему? – Christina

 Смежные вопросы

  • Нет связанных вопросов^_^