我正在尝试创建一个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
注释。
我能够解决这个问题,我希望它能帮助任何试图使用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批处理管理) 根本不使用数据库的作业 我把这两个工作打包在同一个单位,因为从商业角度来看是有意义的。两个作业将一起工作,一个作业的输出将是另一个作业的输入。 运行第二个作业时是否可以禁用特定于数据库的自动配