Spring Boot Spring Batch:无需Spring批处理元数据表的多个数据源
Spring Boot Spring Batch:无需Spring批处理元数据表的多个数据源
我正在编写一个Spring Boot应用程序,用于Spring Batch。其中ItemReader从Oracle数据库读取数据,并将数据写入PostgreSQL。但是我遇到了以下错误:
Caused by: org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [SELECT JOB_INSTANCE_ID, JOB_NAME from BATCH_JOB_INSTANCE where JOB_NAME = ? order by JOB_INSTANCE_ID desc]; nested exception is org.postgresql.util.PSQLException: ERROR: relation "batch_job_instance" does not exist Position: 39 at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:234) ~[spring-jdbc-5.0.8.RELEASE.jar:5.0.8.RELEASE] at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72) ~[spring-jdbc-5.0.8.RELEASE.jar:5.0.8.RELEASE] at org.springframework.jdbc.core.JdbcTemplate.translateException(JdbcTemplate.java:1402) ~[spring-jdbc-5.0.8.RELEASE.jar:5.0.8.RELEASE]
我不想创建Spring Batch元数据表,我的应用程序不需要监视作业,请对此提供建议。提前感谢!
Spring Boot Spring Batch是一个用于处理批处理作业的框架。在使用Spring Boot Spring Batch时,如果需要使用多个数据源(Multiple DataSource),但又不想使用Spring Batch的元数据表来管理作业的元数据,会出现问题。
问题的原因是Spring Batch默认使用一个名为`BATCH_JOB_INSTANCE`的表来存储作业实例的元数据。但是,在某些情况下,我们可能希望使用自己的数据库表来存储作业的元数据,而不是使用Spring Batch的默认表。
解决方法是可以通过配置`spring.batch.initialize-schema`属性来控制是否初始化Spring Batch的元数据表。该属性有两个可选值:`always`和`never`。如果设置为`always`,则会在应用启动时创建Spring Batch的元数据表;如果设置为`never`,则不会创建Spring Batch的元数据表。
除了使用`spring.batch.initialize-schema`属性外,我们还可以手动创建自己的数据表来存储作业的元数据。只需在数据库中创建一个表,用于存储作业实例的元数据,然后在Spring Batch的配置中指定该表的名称。
下面是一些配置的示例:
spring.batch.initialize-schema=never spring.datasource.url=jdbc:mysql://localhost:3306/mydb spring.datasource.username=root spring.datasource.password=secret spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.batch.job-repository.table-prefix=MYSUFFIX_
在上面的示例中,我们将`spring.batch.initialize-schema`属性设置为`never`,表示不使用Spring Batch的元数据表。同时,我们指定了自己的数据源和数据库表的名称。
通过以上配置,我们可以在使用Spring Boot Spring Batch时,使用多个数据源,并且不使用Spring Batch的元数据表来管理作业的元数据。这样可以更加灵活地处理批处理作业。
Spring Boot和Spring Batch是两个常用的Java框架,用于开发批处理应用程序。然而,在使用Spring Batch时,有时会遇到一个问题:如何在没有Spring Batch元数据表的情况下使用多个数据源。
根据异常信息,看起来Spring Batch配置为使用Postgres数据源作为其元数据源,但它找不到BATCH_JOB_INSTANCE表。如果你不想使用元数据表,可以采取以下解决方法:
1. 使用MapJobRepositoryFactoryBean创建一个基于内存的JobRepository。
2. 使用内嵌数据库(如H2、HSQL等)和ResourcelessTransactionManager。Spring Boot会自动为你在内存数据源中创建表。具体细节可以参考这里的文档(链接:https://docs.spring.io/spring-boot/docs/2.0.4.RELEASE/reference/htmlsingle/#howto-initialize-a-spring-batch-database)。
然后,你可以为读取器配置一个Oracle数据源,为写入器配置一个Postgres数据源。在Spring Batch应用程序中,可以配置多个数据源,只需为业务逻辑配置一个数据源,为Spring Batch的内部机制配置另一个数据源。
这里提供了一些类似的问题供参考:
1. Use of multiple DataSources in Spring Batch
感谢你提供的详细解释。目前,我将批处理的元数据保留在Postgres中。如果你需要进一步指导,请参考这个链接:stackoverflow.com/questions/59544730/…