avi*_*iad 7 java transactions jdbc transactionmanager spring-batch
我正在尝试创建基于Spring的解决方案,以便在MySQL 5.5服务器上运行批量SQL查询."查询"是指任何编译的SQL语句,因此SQL批处理作业可以包含例如几个CREATE TABLE,DELETE和INSERT语句.
我正在使用Spring Batch来达到这个目的.
我transactionManager配置如下.
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />
Run Code Online (Sandbox Code Playgroud)
和dataSource:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${batch.jdbc.driver}" />
<property name="url" value="${batch.jdbc.url}" />
<property name="username" value="${batch.jdbc.user}" />
<property name="password" value="${batch.jdbc.password}" />
<property name="maxIdle" value="10" />
<property name="maxActive" value="100" />
<property name="maxWait" value="10000" />
<property name="validationQuery" value="select 1" />
<property name="testOnBorrow" value="false" />
<property name="testWhileIdle" value="true" />
<property name="timeBetweenEvictionRunsMillis" value="1200000" />
<property name="minEvictableIdleTimeMillis" value="1800000" />
<property name="numTestsPerEvictionRun" value="5" />
<property name="defaultAutoCommit" value="true" />
</bean>
Run Code Online (Sandbox Code Playgroud)
我的DAO类配置了方法
@Transactional(propagation = Propagation.REQUIRES_NEW)
Run Code Online (Sandbox Code Playgroud)
并且我循环遍历一个SQL语句的集合,该语句一次用单个SQL语句调用该方法.方法内部的处理非常简单:
simpleJdbcTemplate.getJdbcOperations().execute(sql);
Run Code Online (Sandbox Code Playgroud)
我期望当DAO方法完成时,我会在DB中看到结果.但是,似乎只有在Spring作业执行完成后,结果才会在DB中可用.
我尝试在我的DAO方法中进行提交:
@Transactional(propagation = Propagation.REQUIRES_NEW)
private void executeSingleQuery(String sql) {
PlatformTransactionManager transactionManager = (PlatformTransactionManager)context.getBean("transactionManager");
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setPropagationBehavior(Propagation.REQUIRED.ordinal());
TransactionStatus status = transactionManager.getTransaction(def);
try {
// execute your business logic here
log.info("about to execute SQL query[" + sql + "]");
simpleJdbcTemplate.getJdbcOperations().execute(sql);
} catch (Exception e) {
log.info("SQL query was not committed due to exception and was marked for rollback");
transactionManager.rollback(status);
}
transactionManager.commit(status);
if (transactionManager.getTransaction(null).isRollbackOnly()
&& transactionManager.getTransaction(null).isCompleted()) {
log.info("SQL query commited!");
} else {
log.info("SQL query was not committed due to: 1) the transaction has been marked for rollback " +
"2) the transaction has not completed for some reason");
}
log.info("the query has completed");
}
Run Code Online (Sandbox Code Playgroud)
我调试了Spring代码,看到我从DAO方法调用的提交是由TransactionTemplate执行的(流程到达行this.transactionManager.commit(status);并且没有异常通过)
我将不胜感激任何建议应该做什么,以使DAO方法在每次调用时提交(在执行每个SQL语句后提交).
| 归档时间: |
|
| 查看次数: |
13179 次 |
| 最近记录: |