我正在尝试创建一个Spring Batch应用程序。我们使用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;
}
但是,DefaultBatchConfigurer
在intialize函数中失败,因为它显式构造了自己的JobExplorerFactoryBean。
我想知道是否有一些简单的方法,或者我是否必须复制DefaultBatchConfigurer
类中的工作并自己定义所有bean并删除@EnableBatchProcessing
注释。
答案 0 :(得分:1)
我能够解决这个问题,我希望它可以帮助任何尝试将Spring Batch与开箱即用数据库一起使用的人。有必要扩展DefaultBatchConfigurer
并覆盖createJobRepository()
函数。此外,您应该禁用自动作业表创建。
这是我创建的类,可以用作任何SQL Anywhere Spring Batch作业的基础:
@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();
}
}
请务必先使用schema-sqlserver.sql
设置表格。
您必须在application.properties
我有:
# 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
不起作用,因为设置预准备语句的获取方向会导致&#34;不支持&#34; SQL Exception
被抛出。你可以通过扩展JdbcCursorItemReader
并覆盖你自己班级中的applyStatementSettings
函数(加上几个setter)来解决这个问题。