SpringBoot+Spring Batch+Oracle

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot+Spring Batch+Oracle相关的知识,希望对你有一定的参考价值。

Caused by: org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for transaction;
nested exception is java.sql.SQLException: ORA-01453: SET TRANSACTION 必须是事务处理的第一个语句

参考技术A boot是把一个tomcat/app server都集成进spring,不用另外架web。 batch是单独做大批量任务处理的,比如大批格式转换,大批数据库转换。 是Java EE的标准框架JSR-358的前身和母板。 个人感觉对于单机的简单批量多线程任务

Spring Boot (Batch) - 注入数据源

【中文标题】Spring Boot (Batch) - 注入数据源【英文标题】:Spring Boot (Batch) - Inject Datasource 【发布时间】:2018-01-27 13:45:31 【问题描述】:

我有一个 Spring Boot(面向批处理)应用程序,它使用数据源来完成批处理作业并将内容写入数据库。

我在application.yml 中定义了数据源,例如:

spring:
  datasource:
    url: jdbc:h2:mem:JavaSpringBootBatch
    username: sa
    password:
  profiles: # default, development, production
    active: default, development
---
spring:
  h2:
    # ...config/settings here
  profiles: development
---
spring:
  datasource:
    # ...datasource config here
  profiles: production

问题是当我尝试将数据源注入 Spring 配置文件之一时:

@Configuration
public class PlayerBatchConfig 
  ...

  @Bean
  public ItemWriter<Player> writer(final DataSource dataSource) 
    final JdbcBatchItemWriter<Player> jdbcItemWriter = new JdbcBatchItemWriter<>();
    ...
    jdbcItemWriter.setDataSource(dataSource);
    jdbcItemWriter.setSql(sql.toString());
    return jdbcItemWriter;
  

...它告诉我:

无法自动接线。 'DataSource' 类型的 bean 不止一个。

豆类: 数据源(DataSourceConfiguration.class) 数据源(EmbeddedDataSourceConfiguration.class)

我也尝试像这样注入数据源:

@Configuration
public class PlayerBatchConfig 
  @Bean
  @ConfigurationProperties(prefix = "datasource")
  public DataSource dataSource() 
    return DataSourceBuilder.create().build();
  

  ...

...但没有运气 :( ,虽然这两个数据源的问题最终会消失。

任何线索如何“规避”它?

【问题讨论】:

我认为 "spring.h2.console.enabled=true" 和 "spring.h2.console.path=/h2-console" 启用了 h2 数据库,并且您再次明确定义了另一个数据源,两者都是用于“开发”配置文件。因此容器被视为多个数据源。 不仅仅是那些,而是default 配置文件块上的实际定义。这只让你在浏览http://.../h2-console使用development时访问H2控制台 【参考方案1】:

您想将annotate@Primary 一起使用的DataSource,请参阅spring-boot 文档here 以获取更多信息。除了@Primary,您可能还需要使用@Qualifier 来控制bean 注入。

【讨论】:

就像我说的,问题是我不想返回并在 Java 配置中配置数据源;我想将它们保存在 YAML 文件中。无论如何,我现在就这样,因为到目前为止我找不到让它工作的方法,但是是的,如果我用 Java 配置来做这件事有点容易......【参考方案2】:

由于您有 2 个数据源,因此您需要使用 @Qualifier 对数据源 bean 以及何时使用它们进行注释。 Spring 告诉你它不知道你想使用哪一个。

【讨论】:

以上是关于SpringBoot+Spring Batch+Oracle的主要内容,如果未能解决你的问题,请参考以下文章

Spring boot Batch 的启动原理- Configuration

如何按特定顺序运行 Spring Batch Jobs(Spring Boot)?

Spring Batch/Spring Boot 总是自动启动我的工作

spring boot/batch 通过代码禁用批量自动启动

Spring Boot + Spring Batch + HSQLDB -> 为 JobRepository 配置 HSQLDB

spring boot(spring batch)配置禁用自动创建数据库