Как синхронизировать JOOQ со SpringBatch JdbcTemplate

Я работаю с пакетом Spring и пытаюсь создать TASKLET с двумя фреймворками ORM: используйте jdbcTemplate для простых запросов и фреймворк JOOQ для более сложных запросов.

Вот часть конфигурации весны:

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSourceDbcp_MySQL" /> 
</bean>
<bean id="jobRepository" class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean">
    <property name="transactionManager" ref="transactionManager" />
</bean>
<bean id="jobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
    <property name="jobRepository" ref="jobRepository" />
</bean>
<job id="importProductsJob" xmlns="http://www.springframework.org/schema/batch">
    <step id="readWrite">
        <tasklet transaction-manager="transactionManager">
            <chunk  reader="multiResourceReader" 
                    processor="itemProcessor" 
                    writer="itemWriter" 
                    commit-interval="250" />
        </tasklet>
    </step>
</job>
<bean id="itemWriter" class="com.myexample.writer.JdbcSequenceWriter">
    <property name="dataSourceTransactionManager" ref="transactionManager" />
    <!-- and some more specific properties -->
</bean>

Я инициализирую свои ORM в установщике в com.myexample.writer.JdbcSequenceWriter:

private JdbcTemplate jdbcTemplate;
private JdbcTemplate jdbcTemplate2; 
private DSLContext dslContext;

public void setDataSourceTransactionManager(DataSourceTransactionManager trxManager) {
    this.jdbcTemplate = new JdbcTemplate(trxManager.getDataSource());
    this.jdbcTemplate2 = new JdbcTemplate(trxManager.getDataSource());
    dslContext = DSL.using(trxManager.getDataSource(), SQLDialect.MYSQL);
}

Оба jdbcTemplate имеют один сеанс, и я могу ВСТАВИТЬ запись, используя «jdbcTemplate», и найти эту запись, используя SELECT с «jdbcTemplate2». Но если попытаться ВСТАВИТЬ запись с любым «jdbcTemplate» и найти ее с помощью dslContext (JOOQ ORM), у меня будет пустой результат. Я понимаю, что Spring Batch использует какой-то хитрый менеджер транзакций, который откатывает всю операцию, если «писатель» не может завершить все свои операции. Но как я могу синхронизировать другой фреймворк с одним менеджером транзакций?


person user2602807    schedule 12.01.2014    source источник


Ответы (1)


обычно ожидаемое поведение — это то, что вы наблюдаете между JdbcTemplate и dslContext: каждый получает отдельное соединение с БД из DataSource.

Ваш первый вывод с двумя экземплярами JdbcTemplate — это особое поведение, для которого JdbcTemplate должно было быть специально разработано. По-видимому, все его экземпляры используют одно и то же внутреннее соединение.

Вы можете заставить оба работать (вероятно), сначала получив JDBC Connection от DataSource, а затем передав его как JdbcTemplate, так и dslContext. Это не поддерживаемый шаблон использования, и с ним все еще могут быть проблемы.

После того, как вы установили связь, естественно, вы также будете отвечать за ее освобождение.

person Marko Topolnik    schedule 12.01.2014