我遇到了类似的问题。我有2个主要的数据源,第二个应该由spring批处理使用。春季批处理是在主要数据源中创建模式,然后尝试在第二个数据源中插入/更新,这是我的代码:
例外:java.sql.SQLSyntaxErrorException:用户缺少特权或未找到对象:语句[SELECT JOB_INSTANCE_ID,BATCH_JOB_INSTANCE中的JOB_NAME中的BATCH_JOB_INSTANCE,其中JOB_NAME =吗?和JOB_KEY =?]
public class DataSourceConfig {
@Bean
@Primary
@ConfigurationProperties("spring.datasource")
public DataSourceProperties primaryDataSourceProperties() {
return new DataSourceProperties();
}
@Bean("secondDataSourceProperties")
@ConfigurationProperties("spring.second-datasource")
public DataSourceProperties secondDataSourceProperties() {
return new DataSourceProperties();
}
/**
* Create primary (default) DataSource.
*/
@Bean
@Primary
public DataSource primaryDataSource(@Autowired DataSourceProperties props) {
return props.initializeDataSourceBuilder().build();
}
/**
* Create second DataSource and named "secondDatasource".
*/
@Bean("secondDatasource")
public DataSource secondDataSource(@Autowired
@Qualifier("secondDataSourceProperties") DataSourceProperties props) {
return props.initializeDataSourceBuilder().build();
}
}
和
@Component
@Configuration
public class MyBatchConfigurer extends DefaultBatchConfigurer {
/**
* Initialize the BatchConfigurer to use the datasource of your choosing
*
* @param secondDatasource
*/
@Autowired
@Qualifier("secondDatasource")
DataSource datasource;
@Override
protected JobRepository createJobRepository() throws Exception {
JobRepositoryFactoryBean factory = new JobRepositoryFactoryBean();
factory.setDataSource(datasource);
factory.setTransactionManager(transactionManager());
factory.afterPropertiesSet();
return factory.getObject();
}
private PlatformTransactionManager transactionManager() {
return new DataSourceTransactionManager(datasource);
}
}
答案 0 :(得分:0)
创建BatchConfigurer
的自定义实现。
import javax.annotation.PostConstruct;
import javax.sql.DataSource;
import org.springframework.batch.core.configuration.BatchConfigurationException;
import org.springframework.batch.core.explore.JobExplorer;
import org.springframework.batch.core.explore.support.JobExplorerFactoryBean;
import org.springframework.batch.core.explore.support.MapJobExplorerFactoryBean;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.batch.core.launch.support.SimpleJobLauncher;
import org.springframework.batch.core.repository.JobRepository;
import org.springframework.batch.core.repository.support.JobRepositoryFactoryBean;
import org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean;
import org.springframework.batch.support.transaction.ResourcelessTransactionManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.stereotype.Component;
import org.springframework.transaction.PlatformTransactionManager;
@Component
public class MyBatchConfigurer implements BatchConfigurer {
private PlatformTransactionManager transactionManager;
private JobRepository jobRepository;
private JobLauncher jobLauncher;
private JobExplorer jobExplorer;
@Autowired
@Qualifier("secondDatasource")
private DataSource dataSource;
@Override
public JobRepository getJobRepository() {
return jobRepository;
}
@Override
public PlatformTransactionManager getTransactionManager() {
return new DataSourceTransactionManager(datasource);
}
@Override
public JobLauncher getJobLauncher() {
return jobLauncher;
}
@Override
public JobExplorer getJobExplorer() {
return jobExplorer;
}
@PostConstruct
public void initialize() {
try {
this.jobRepository = createJobRepository();
this.jobExplorer = createJobExplorer();
this.jobLauncher = createJobLauncher();
} catch (Exception e) {
throw new BatchConfigurationException(e);
}
}
protected JobLauncher createJobLauncher() throws Exception {
SimpleJobLauncher jobLauncher = new SimpleJobLauncher();
jobLauncher.setJobRepository(jobRepository);
jobLauncher.afterPropertiesSet();
return jobLauncher;
}
protected JobRepository createJobRepository() throws Exception {
JobRepositoryFactoryBean factory = new JobRepositoryFactoryBean();
factory.setDataSource(datasource);
factory.setTransactionManager(transactionManager());
factory.afterPropertiesSet();
return factory.getObject();
}
protected JobExplorer createJobExplorer() throws Exception {
JobExplorerFactoryBean jobExplorerFactoryBean = new JobExplorerFactoryBean();
jobExplorerFactoryBean.setDataSource(this.dataSource);
jobExplorerFactoryBean.afterPropertiesSet();
return jobExplorerFactoryBean.getObject();
}
}
答案 1 :(得分:0)
这就是我所做的,以使其正常工作 我刚刚添加了一个注入第二个数据源的bean。
@Bean
BatchConfigurer configurer(@Autowired @Qualifier("secondDatasource") DataSource dataSource) {
return new DefaultBatchConfigurer(dataSource);
}
但仍然没有创建架构 我用过:
@Configuration
@Profile({"dev","prod"})
public class JobRepositorySchemaConfig {
private final String JOB_REPO_SCHEMA = "classpath:batch_repo_schema.sql";
@Autowired
@Qualifier("secondDatasource")
DataSource datasource;
@Autowired
WebApplicationContext webApplicationContext;
@PostConstruct
public void loadIfInMemory() throws Exception {
Resource resource = webApplicationContext.getResource("classpath:/org/springframework/batch/core/schema-drop-hsqldb.sql");
Resource resource2 = webApplicationContext.getResource("classpath:/org/springframework/batch/core/schema-hsqldb.sql");
ScriptUtils.executeSqlScript(datasource.getConnection(), resource);
ScriptUtils.executeSqlScript(datasource.getConnection(), resource2);
}
}