Java apachespark和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

我在集群环境中使用ApacheSpark,有3名工作人员。 从Spark的“foreachpartition”,我以事务模式将数据批量发送到Spring jdbcTemplate.batchUpdate

我对春季交易不太了解。对于Spring事务,我使用以下代码:

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
返回的记录数也与预期相同。