如何将JOOQ与SpringBatch JdbcTemplate同步

时间:2014-01-12 21:06:53

标签: java spring-batch jooq transactionmanager

我正在使用Spring批处理并尝试使用两个“ORM”框架构建TASKLET: 使用jdbcTemplate进行简单查询,使用JOOQ框架进行更复杂的查询。

这是spring config的一部分:

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

我在com.myexample.writer.JdbcSequenceWriter的setter初始化我的ORM:

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'插入记录,并使用带有'jdbcTemplate2'的SELECT查找此记录。但是如果尝试使用任何'jdbcTemplate'插入记录并使用dslContext(JOOQ ORM)找到它我得到空结果。 我并不认为Spring Batch使用了一些棘手的tansaction管理器,如果'writer'无法完成所有操作,那么就会回滚所有操作。但是如何将另一个框架与单个事务管理器同步?

1 个答案:

答案 0 :(得分:2)

通常预期的行为是您在JdbcTemplatedslContext之间观察到的行为:每个行为都从DataSource获取单独的数据库连接。

您的第一个发现(包含两个JdbcTemplate个实例)是特殊行为,JdbcTemplate必须专门为其设计。显然,它的所有实例都在内部共享相同的连接。

您可以通过首先从Connection获取JDBC DataSource然后将其传递给JdbcTemplatedslContext来使两者都工作(可能)。这不是支持的使用模式,可能仍然存在问题。

一旦你获得了连接,你自然也将负责释放它。

相关问题