当前位置: 首页 > 知识库问答 >
问题:

使用带有自动配置和非标准数据库的Spring批处理

殷功
2023-03-14

我正在尝试创建一个Spring批处理应用程序。我们使用SQL Anywhere数据库,它实际上是SQLServer,一种已知的数据库类型。为了简化操作,我在主类上使用了@SpringBootApplication,在配置类上使用了@EnableBatchProcessing

问题是,我的数据库驱动程序sybase.jdbc4.sqlanywhere.idriver返回一个产品名“SQL Anywhere”,而Spring无法识别这个名称,从而导致各种错误。通过在配置类中显式创建JobRepositoryFactoryBean,我能够克服其中的一些问题:

/**
 * We can't rely on Spring Boot as it can't set the database type properly.
 * 
 * By explicitly requiring the arguments in the constructor, we force the Autowiring
 * to occur.
 */
@Bean
public JobRepositoryFactoryBean jobRepositoryFactory(DataSource ds, PlatformTransactionManager tm) {
    JobRepositoryFactoryBean jf = new JobRepositoryFactoryBean();

    jf.setDataSource(ds);
    jf.setTransactionManager(tm);
    jf.setDatabaseType("SQLSERVER");
    jf.setTablePrefix("DBA.BATCH_");
    jf.setIsolationLevelForCreate("ISOLATION_SERIALIZABLE");    // only one instance at a time

    return jf;
}

但是,DefaultBatchConfigureer在初始化函数中失败,因为它显式地构造了自己的JobExplorerFactoryBean。

我想知道是否有一些简单的方法来解决这一问题,或者我必须重复DefaultBatchConfigureer类中的工作,自己定义所有bean并删除@EnableBatchProcessing注释。

共有1个答案

戴原
2023-03-14

我能够解决这个问题,我希望它能帮助任何试图使用Spring Batch的数据库的人。需要扩展DefaultBatchConfigureer并重写CreateJobRepository()函数。此外,还应禁用自动创建职务表。

下面是我创建的类,它可以用作任何SQL Anywhere Spring批处理作业的基础:

@EnableBatchProcessing
public class SqlAnywhereBatchConfigurer extends DefaultBatchConfigurer {

  @Autowired
  private DataSource dataSource;
  @Autowired
  private PlatformTransactionManager transactionManager;

  public SqlAnywhereBatchConfigurer() {
      super();
  }

  public SqlAnywhereBatchConfigurer(DataSource dataSource) {
      super(dataSource);
  }

  @Override
  protected JobRepository createJobRepository() throws Exception {
    JobRepositoryFactoryBean factory = new JobRepositoryFactoryBean();
    factory.setDataSource(dataSource);
    factory.setTransactionManager(transactionManager);
    factory.setDatabaseType("SQLSERVER");
    factory.afterPropertiesSet();
    return factory.getObject();
  }
}

记住首先使用模式-sqlserver.sql设置表。

# database
spring.datasource.url=jdbc:sqlanywhere:Server=<your server name>;port=2638
spring.datasource.username=<your username>
spring.datasource.password=<your password>
spring.datasource.driver-class-name=sybase.jdbc4.sqlanywhere.IDriver
# don't create tables on startup
spring.datasource.initialize=false
spring.batch.initializer.enabled=false

最后,这里值得一提的是,对于SQL Anywhere至少JDBCCursorItemReader不起作用,因为设置prepared语句的提取方向会引发“不支持”SQL异常。您可以通过扩展jdbcCursorItemReader并在自己的类中重写applyStatementSettings函数(加上几个setter)来解决这一问题。

 类似资料:
  • 批处理配置具有spring作业,只有一个步骤 1)读取器-从csv文件读取。处理器对文件应用一些规则。Drools请运行schema-postgresql.sql来设置数据库 WRITER使用SPRING DATA JPA写入DB Writer将此称为PersonDaoImpl:

  • 我试图用spring Cloud Config和数据库后端设置一个Spring Boot项目。我在设置中有以下内容: 我在应用程序类中有。另外,我在一个控制器中有,我试图从数据库中注入一个值。 我在DB中有一个条目。 为了刷新,我在中使用空主体执行一个POST操作,它返回成功200。但是字段的值仍然是来自属性文件的值,并且没有更新。 当我转到GET时,我会在响应中看到新值,但是字段仍然没有刷新。我

  • 我正在编写Spring批的Spring Boot应用程序,其中ItemReader从Oracle数据库读取数据并将数据写入postgres sql,但我得到了以下错误 我不想创建spring批处理元数据表,我的应用程序不需要监视作业,请就此向我提出建议。提前谢谢!!

  • 问题内容: 我们有一个应用程序被部署了120次,每个应用程序的配置略有不同。我们希望将配置存储在数据库中,以进行审核和管理。 如何不使用XML直接从数据库实例化Spring Bean? 谢谢 问题答案: 您不能有零个XML配置(除非您使用JavaConfig,这不会使情况有所不同)。您可以将其中一些外部化到数据库,并使用custom 。有关如何实现此目的,请参见本文。

  • 我的Spring批处理应用程序有多个作业,但只有一个作业使用一些特定的Spring Boot自动配置特性: 使用spring-data-jpa自动配置为业务事务配置数据库的作业(不是Spring批处理管理) 根本不使用数据库的作业 我把这两个工作打包在同一个单位,因为从商业角度来看是有意义的。两个作业将一起工作,一个作业的输出将是另一个作业的输入。 运行第二个作业时是否可以禁用特定于数据库的自动配