2014-01-12 3 views
1

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

Вот часть из пружинной конфигурации:

<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> 

Я инициализирует свои ORMS в инкубаторе в 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 использует какой-то хитрый менеджер tansaction, ведьма откатывает всю операцию, если «писатель» не может закончить все свои операции. Но как я могу синхронизировать другую структуру с одним менеджером транзакций?

+0

Просто проверка: как вы настроили этот источник данных? В руководстве jOOQ [[] предлагается использовать «TransactionAwareDataSourceProxy» Spring (http://www.jooq.org/doc/3.4/manual/getting-started/tutorials/jooq-with-spring/) –

ответ

2

в целом ожидается поведение, что вы наблюдаете между JdbcTemplate и dslContext: каждый получает отдельное соединение DB от DataSource.

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

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

Как только вы приобрели соединение, вы, естественно, будете его освобождать.