Как настроить источник данных Spring, чтобы избежать участия в синхронизации транзакций? - PullRequest
0 голосов
/ 06 июня 2018

Я наблюдаю странное поведение, связанное с тем, как Spring обрабатывает операции с несколькими источниками данных, особенно с участием в синхронизации транзакций.

В контексте My Spring настроены два источника данных:

1)dataSource1 - база данных MySQL

2) dataSource2 - база данных Apache Impala

Для обоих источников данных настроен шаблон jdbc.Дополнительно dataSource1 имеет настроенный менеджер транзакций.dataSource2 не имеет настроенного менеджера транзакций (Apache Impala не имеет транзакций по своему дизайну, он просто предоставляет SQL-подобные функции запросов через JDBC-коннектор).

Я использую эту конфигурацию в подпружиненном приложении -dataSource1 и его TransactionsManager настроены для хранения данных, связанных с метаинформацией задания Spring-Batch.

Далее у меня задание Spring-Batch, настроенное с помощью одного пользовательского шага Tasklet.На этом этапе я обращаюсь к dataSource2 через его шаблон jdbc.И именно здесь возникает проблема - к моему удивлению, подключение к dataSource2 начинает участвовать в синхронизации транзакций.

2018-06-06 10:41:08,179 DEBUG [main] org.springframework.jdbc.datasource.DataSourceUtils - Registering transaction synchronization for JDBC Connection

Я понимаю, что при запуске подпружиненного шага запускается транзакция, связанная с dataSource1однако почему dataSource2 так или иначе участвует в этом?

Отрицательным побочным эффектом является то, что как только соединение с dataSource2 начинает участвовать в синхронизации транзакций, соединение не закрывается после завершения, например, команды jdbcTemplate.execute (...),По сути, я наблюдаю, что открытые соединения с dataSource2 закрываются только после завершения внешней транзакции.

Есть ли способ настроить контекст Spring и dataSource2, чтобы они не участвовали в синхронизации транзакций?

Конфигурация

<bean id="dataSource1" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">
    <constructor-arg ref="hikariConfig" />
</bean>

<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
    <property name="poolName" value="springHikariCP" />
    <property name="dataSourceClassName" value="com.mysql.jdbc.jdbc2.optional.MysqlDataSource" />
    ...
</bean>

<bean id="dataSource1JdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource" ref="dataSource1"/>
</bean>

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager" p:entityManagerFactory-ref="entityManagerFactory"/>

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" p:dataSource-ref="dataSource1">
    <property name="packagesToScan" value="..."/>
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
    </property>
    <property name="sharedCacheMode" value="DISABLE_SELECTIVE"/>
</bean>



<bean id="dataSource2" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
    <property name="driverClass" value="org.apache.hive.jdbc.HiveDriver"/>
    ...
</bean>

<bean id="dataSource2JdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource" ref="dataSource2"/>
</bean>
...