Java apachespark和Spring事务管理
我在集群环境中使用ApacheSpark,有3名工作人员。 从Spark的“foreachpartition”,我以事务模式将数据批量发送到Spring jdbcTemplate.batchUpdate 我对春季交易不太了解。对于Spring事务,我使用以下代码:Java apachespark和Spring事务管理,java,spring,transactions,apache-spark,jdbctemplate,Java,Spring,Transactions,Apache Spark,Jdbctemplate,我在集群环境中使用ApacheSpark,有3名工作人员。 从Spark的“foreachpartition”,我以事务模式将数据批量发送到Spring jdbcTemplate.batchUpdate 我对春季交易不太了解。对于Spring事务,我使用以下代码: DefaultTransactionDefinition paramTransactionDefinition = new DefaultTransactionDefinition(); Transactio
DefaultTransactionDefinition paramTransactionDefinition = new
DefaultTransactionDefinition();
TransactionStatus status =
transactionManager.getTransaction(paramTransactionDefinition );
//sql and jdbcArgs preparation...
//....
jdbcTemplate.batchUpdate(finalSql, jdbcArgs);
transactionManager.commit(status);
上述代码的调用方式如下:
.foreachpartition(...params..) {
call(..params..) {
if(basicDataSource == null || transactionManager == null) {
BasicDataSource bds = getBasicDataSource(basicDatasrc,
isTransactionRequired);//for transaction
transactionManager2.setDataSource(bds);//DataSourceTransactionManager
jdbcTemplate.setBasicDataSource(bds);
// initializing dataSource to transactionManager and jdbcTemplate both because read somewhere that connection object instance should be same for transactionManager and jdbcTemplate.
}//end of if
// here call to above transaction and jdbcTemplate.batchUpdate code goes
}//end of call
private BasicDataSource getDataSource() {
BasicDataSource basicDs = new BasicDataSource();
basicDs.setUsername(sparkDs.getUsername());
basicDs.setPassword(sparkDs.getPassword());
basicDs.setUrl(sparkDs.getUrl());
basicDs.setDriverClassName(sparkDs.getDriverClassName());
basicDs.setMaxActive(sparkDs.getMaxActive());
basicDs.setDefaultAutoCommit(false);
}//end of getDatasource
}
我并没有在这里关闭连接,正如我在jdbcTemplate代码中看到的,连接是由spring本身释放的。
现在,问题是:上面的事务代码没有将完整的数据写入数据库。
当我不使用事务时,就没有任何问题
我的问题是,以上是创建数据源和事务的正确方法吗?
因为上面的代码是在3个工人和40个分区上执行的。虽然basicDatasource没有被创建40次,但是它被创建了5-8次
有人能帮我一下吗。你能在提交后检查事务状态看看是否有异常吗?@urug:是的,我检查了状态为:
status.isCompleted
,它返回true。甚至jdbcTemplate.batchUpdate
返回的记录数也与预期相同。