spring 引导和批处理抛出无效的对象名称 'BATCH_JOB_INSTANCE'
spring boot and batch throw Invalid object name 'BATCH_JOB_INSTANCE'
我在我的应用程序中被 spring 引导卡住了,它不想 运行 模式或表,只连接到我的数据库 SQL 服务器和查询信息,所以我禁用了文件 application.properties
中的这一行
spring.batch.initialize-架构=从不
spring.datasource.initialization-模式=从不
但不起作用,我不知道出了什么问题,已经配置了我的数据源,在此先感谢,
我希望有人能帮助我,抱歉我的英语不好。
我使用的是spring boot 2.2.6,我的DataSourceConfiguration代码
.....
@EnableAutoConfiguration(排除={DataSourceAutoConfiguration.class})
public class DataSourceConfiguration {
@豆
@基本的
@Qualifier("jobsDataSource")
public 数据源 hsqldbDataSource() 抛出 SQLException {
final SimpleDriverDataSource 数据源 = new SimpleDriverDataSource();
dataSource.setDriver(新org.hsqldb.jdbcDriver());
dataSource.setUrl("jdbc:hsqldb:mem:mydb");
dataSource.setUsername("sa");
dataSource.setPassword("");
return数据源;
}
@豆
public JdbcTemplate jdbcTemplate(final DataSource 数据源) {
return 新的 JdbcTemplate(数据源);
}
@豆
@Qualifier("sqlserverDataSource")
public 数据源 sqlserverDataSource() 抛出 SQLException {
final SimpleDriverDataSource 数据源 = new SimpleDriverDataSource();
dataSource.setDriver(新net.sourceforge.jtds.jdbc.Driver());
dataSource.setUrl("jdbc:jtds:sqlserver://x.y.z.t:1433/mydb");
dataSource.setUsername("usersqlserver");
dataSource.setPassword("xxxxxx");
return数据源;
}
@豆
public JdbcTemplate sqlJdbcTemplate(@Qualifier("sqlserverDataSource") final DataSource 数据源) {
return 新的 JdbcTemplate(数据源);
}
public PlatformTransactionManager transactionManager(){
return 新的 ResourcelessTransactionManager();
}
@豆
public BatchConfigurer 配置器(@Qualifier("sqlserverDataSource") DataSource 数据源){
return 新的 DefaultBatchConfigurer(){
@覆盖
受保护的 JobRepository createJobRepository() 抛出异常 {
JobRepositoryFactoryBean factory = new JobRepositoryFactoryBean();
factory.setDataSource(数据源);
factory.setTransactionManager(事务管理器());
return factory.getObject();
// MapJobRepositoryFactoryBean mapJobRepositoryFactoryBean = new MapJobRepositoryFactoryBean(transactionManager());
// mapJobRepositoryFactoryBean.setTransactionManager(transactionManager());
// return mapJobRepositoryFactoryBean.getObject();
}
@覆盖
受保护的 JobLauncher createJobLauncher() 抛出异常 {
SimpleJobLauncher jobLauncher = new SimpleJobLauncher();
jobLauncher.setJobRepository(createJobRepository());
jobLauncher.setTaskExecutor(新的SimpleAsyncTaskExecutor());
jobLauncher.afterPropertiesSet();
return 工作启动器;
}
};
}
}
这里是错误
原因:org.springframework.jdbc.BadSqlGrammarException:PreparedStatementCallback;错误的 SQL 语法 [SELECT JOB_INSTANCE_ID,JOB_NAME 来自 BATCH_JOB_INSTANCE 其中 JOB_NAME = ?和 JOB_KEY = ?];嵌套异常是 java.sql.SQLException:无效的对象名称 'BATCH_JOB_INSTANCE'。
在 org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:235) ~[spring-jdbc-5.2.5.RELEASE.jar:5.2.5.RELEASE]
在 org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72) ~[spring-jdbc-5.2.5.RELEASE.jar:5.2.5.RELEASE]
在 org.springframework.jdbc.core.JdbcTemplate.translateException(JdbcTemplate.java:1443) ~[spring-jdbc-5.2.5.RELEASE.jar:5.2.5.RELEASE]
在 org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:633) ~[spring-jdbc-5.2.5.RELEASE.jar:5.2.5.RELEASE]
在 org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:669) ~[spring-jdbc-5.2.5.RELEASE.jar:5.2.5.RELEASE]
在 org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:700) ~[spring-jdbc-5.2.5.RELEASE.jar:5.2.5.RELEASE]
在 org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:712) ~[spring-jdbc-5.2.5.RELEASE.jar:5.2.5.RELEASE]
在 org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:768) ~[spring-jdbc-5.2.5.RELEASE.jar:5.2.5.RELEASE]
在 org.springframework.batch.core.repository.dao.JdbcJobInstanceDao.getJobInstance(JdbcJobInstanceDao.java:151) ~[spring-batch-core-4.2.1.RELEASE.jar:4.2.1.RELEASE]
在 org.springframework.batch.core.repository.support.SimpleJobRepository.isJobInstanceExists(SimpleJobRepository.java:91) ~[spring-batch-core-4.2.1.RELEASE.jar:4.2.1.RELEASE]
在 sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)~[na:1.8.0_161]
在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_161]
在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_161]
在 java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_161]
在 org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344) ~[spring-aop-5.2.5.RELEASE.jar:5.2.5.RELEASE]
在 org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198) ~[spring-aop-5.2.5.RELEASE.jar:5.2.5.RELEASE]
在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.2.5.RELEASE.jar:5.2.5.RELEASE]
在 org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:366) ~[spring-tx-5.2.5.RELEASE.jar:5.2.5.RELEASE]
在 org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:118) ~[spring-tx-5.2.5.RELEASE.jar:5.2.5.RELEASE]
在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.2.5.RELEASE.jar:5.2.5.RELEASE]
在 org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212) ~[spring-aop-5.2.5.RELEASE.jar:5.2.5.RELEASE]
在 com.sun.proxy.$Proxy54.isJobInstanceExists(未知来源)~[na:na]
在 sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)~[na:1.8.0_161]
在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_161]
在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_161]
在 java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_161]
在 org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344) ~[spring-aop-5.2.5.RELEASE.jar:5.2.5.RELEASE]
在 org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198) ~[spring-aop-5.2.5.RELEASE.jar:5.2.5.RELEASE]
在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.2.5.RELEASE.jar:5.2.5.RELEASE]
在 org.springframework.batch.core.configuration.annotation.SimpleBatchConfiguration$PassthruAdvice.invoke(SimpleBatchConfiguration.java:127) ~[spring-batch-core-4.2.1.RELEASE.jar:4.2.1.RELEASE]
在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.2.5.RELEASE.jar:5.2.5.RELEASE]
在 org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212) ~[spring-aop-5.2.5.RELEASE.jar:5.2.5.RELEASE]
在 com.sun.proxy.$Proxy46.isJobInstanceExists(未知来源)~[na:na]
在 org.springframework.boot.autoconfigure.batch.JobLauncherCommandLineRunner.getNextJobParameters(JobLauncherCommandLineRunner.java:199) ~[spring-boot-autoconfigure-2.2.6.RELEASE.jar:2.2.6.RELEASE]
在 org.springframework.boot.autoconfigure.batch.JobLauncherCommandLineRunner.execute(JobLauncherCommandLineRunner.java:191) ~[spring-boot-autoconfigure-2.2.6.RELEASE.jar:2.2.6.RELEASE]
在 org.springframework.boot.autoconfigure.batch.JobLauncherCommandLineRunner.executeLocalJobs(JobLauncherCommandLineRunner.java:166) ~[spring-boot-autoconfigure-2.2.6.RELEASE.jar:2.2.6.RELEASE]
在 org.springframework.boot.autoconfigure.batch.JobLauncherCommandLineRunner.launchJobFromProperties(JobLauncherCommandLineRunner.java:153) ~[spring-boot-autoconfigure-2.2.6.RELEASE.jar:2.2.6.RELEASE]
在 org.springframework.boot.autoconfigure.batch.JobLauncherCommandLineRunner.run(JobLauncherCommandLineRunner.java:148) ~[spring-boot-autoconfigure-2.2.6.RELEASE.jar:2.2.6.RELEASE]
在 org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:784) [spring-boot-2.2.6.RELEASE.jar:2.2.6.RELEASE]
...省略了 10 个常见框架
原因:java.sql.SQLException:无效的对象名称 'BATCH_JOB_INSTANCE'。
在 net.sourceforge.jtds.jdbc.SQLDiagnostic.addDiagnostic(SQLDiagnostic.java:372) ~[jtds-1.3.1.jar:1.3.1]
在 net.sourceforge.jtds.jdbc.TdsCore.tdsErrorToken(TdsCore.java:2988) ~[jtds-1.3.1.jar:1.3.1]
在 net.sourceforge.jtds.jdbc.TdsCore.nextToken(TdsCore.java:2421) ~[jtds-1.3.1.jar:1.3.1]
提前致谢
Spring 批处理需要您数据库中的几个表才能 运行。因此,您需要预先手动创建这些表或告诉 Spring Boot 为您完成。
由于您通过设置 spring.batch.initialize-schema=never
告诉 Spring Boot 不为您创建这些表,因此您需要在目标数据源中自己创建它们。
因此在您的情况下,您需要 运行 DDL script 在 SQL 服务器实例 之前创建 Spring 批处理表 运行完成你的工作。
好吧,我已经删除了这一行并且我按照你的建议做了并且它起作用了,只有 dao 是 NullpointerException,它是接口并在 Itemprocessor 中使用:
</p>
<pre><code>@Bean
public BatchConfigurer configurer(@Qualifier("sqlserverDataSource") DataSource dataSource){
return new DefaultBatchConfigurer(){
// @Override
// protected JobRepository createJobRepository() throws Exception {
// JobRepositoryFactoryBean factory = new JobRepositoryFactoryBean();
// factory.setDataSource(dataSource);
// factory.setTransactionManager(transactionManager());
// // factory.setIsolationLevelForCreate("ISOLATION_READ_COMMITTED");
// //factory.setTablePrefix("dbo.tmpAccWebServ");
// //factory.setDatabaseType("SQLSERVER");
// //factory.setMaxVarCharLength(1000);
// return factory.getObject();
//// MapJobRepositoryFactoryBean mapJobRepositoryFactoryBean = new MapJobRepositoryFactoryBean(transactionManager());
//// mapJobRepositoryFactoryBean.setTransactionManager(transactionManager());
//// return mapJobRepositoryFactoryBean.getObject();
// }
//
// @Override
// protected JobLauncher createJobLauncher() throws Exception {
// SimpleJobLauncher jobLauncher = new SimpleJobLauncher();
// jobLauncher.setJobRepository(createJobRepository());
// jobLauncher.setTaskExecutor(new SimpleAsyncTaskExecutor());
// jobLauncher.afterPropertiesSet();
// return jobLauncher;
// }
@Override
public void setDataSource(DataSource dataSource) {
// override to do not set datasource even if a datasource exist.
// initialize will use a Map based JobRepository (instead of database)
} //
};
}//
这是 CustomerItemProcessor 的代码
</p>
<pre><code>public class CustomerItemProcessor implements ItemProcessor<beangenerico,ThreadLocal<CopyOnWriteArrayList<beanCustomer>>> {
@Autowired
private CustomerDAO customerDAO;
private ThreadLocal<CopyOnWriteArrayList<beanCustomer>> listbean = new ThreadLocal<CopyOnWriteArrayList<beanCustomer>>();
public ThreadLocal<CopyOnWriteArrayList<beanCustomer>> process(beangenerico rangos) throws Exception {
System.out.println("entro a customitemprocessor");
listbean.set(new CopyOnWriteArrayList<beanCustomer>());
System.out.println("rangos:"+rangos.getIni()+"-"+rangos.getFin());
listbean = customerDAO.getAccAgentes(rangos);
if(listbean != null) {
//customer.setId(currentCustomer.getId());
return listbean;
} else {
return null;
}
}
@Autowired
public void setCustomerDAO(CustomerDAOImpl customerDAO) {
this.customerDAO = customerDAO;
}
}
这是接口代码
</p>
<pre><code>public interface CustomerDAO {
ThreadLocal<CopyOnWriteArrayList<beanCustomer>> getAccAgentes(beangenerico bean);
}
这是 CustomerDAOImpl 的代码
</p>
<pre><code>@Repository
@Component
public class CustomerDAOImpl implements CustomerDAO{
private String SP_SQL = "{call mysp(?, ?)}";
@Autowired
@Qualifier("sqlserverDataSource")
DataSource dataSource;
@Autowired
JdbcTemplate jdbcTemplate;
public ThreadLocal<CopyOnWriteArrayList<beanCustomer>> getAccAgentes(beangenerico bean) {
...
//query resulset
}
public JdbcTemplate getJdbcTemplate() {
return jdbcTemplate;
}
}
在此先感谢您的帮助。
我在我的应用程序中被 spring 引导卡住了,它不想 运行 模式或表,只连接到我的数据库 SQL 服务器和查询信息,所以我禁用了文件 application.properties
中的这一行spring.batch.initialize-架构=从不 spring.datasource.initialization-模式=从不
但不起作用,我不知道出了什么问题,已经配置了我的数据源,在此先感谢, 我希望有人能帮助我,抱歉我的英语不好。
我使用的是spring boot 2.2.6,我的DataSourceConfiguration代码
..... @EnableAutoConfiguration(排除={DataSourceAutoConfiguration.class}) public class DataSourceConfiguration { @豆 @基本的 @Qualifier("jobsDataSource") public 数据源 hsqldbDataSource() 抛出 SQLException { final SimpleDriverDataSource 数据源 = new SimpleDriverDataSource(); dataSource.setDriver(新org.hsqldb.jdbcDriver()); dataSource.setUrl("jdbc:hsqldb:mem:mydb"); dataSource.setUsername("sa"); dataSource.setPassword(""); return数据源; } @豆 public JdbcTemplate jdbcTemplate(final DataSource 数据源) { return 新的 JdbcTemplate(数据源); } @豆 @Qualifier("sqlserverDataSource") public 数据源 sqlserverDataSource() 抛出 SQLException { final SimpleDriverDataSource 数据源 = new SimpleDriverDataSource(); dataSource.setDriver(新net.sourceforge.jtds.jdbc.Driver()); dataSource.setUrl("jdbc:jtds:sqlserver://x.y.z.t:1433/mydb"); dataSource.setUsername("usersqlserver"); dataSource.setPassword("xxxxxx"); return数据源; } @豆 public JdbcTemplate sqlJdbcTemplate(@Qualifier("sqlserverDataSource") final DataSource 数据源) { return 新的 JdbcTemplate(数据源); } public PlatformTransactionManager transactionManager(){ return 新的 ResourcelessTransactionManager(); } @豆 public BatchConfigurer 配置器(@Qualifier("sqlserverDataSource") DataSource 数据源){ return 新的 DefaultBatchConfigurer(){ @覆盖 受保护的 JobRepository createJobRepository() 抛出异常 { JobRepositoryFactoryBean factory = new JobRepositoryFactoryBean(); factory.setDataSource(数据源); factory.setTransactionManager(事务管理器()); return factory.getObject(); // MapJobRepositoryFactoryBean mapJobRepositoryFactoryBean = new MapJobRepositoryFactoryBean(transactionManager()); // mapJobRepositoryFactoryBean.setTransactionManager(transactionManager()); // return mapJobRepositoryFactoryBean.getObject(); } @覆盖 受保护的 JobLauncher createJobLauncher() 抛出异常 { SimpleJobLauncher jobLauncher = new SimpleJobLauncher(); jobLauncher.setJobRepository(createJobRepository()); jobLauncher.setTaskExecutor(新的SimpleAsyncTaskExecutor()); jobLauncher.afterPropertiesSet(); return 工作启动器; } }; } }
这里是错误
原因:org.springframework.jdbc.BadSqlGrammarException:PreparedStatementCallback;错误的 SQL 语法 [SELECT JOB_INSTANCE_ID,JOB_NAME 来自 BATCH_JOB_INSTANCE 其中 JOB_NAME = ?和 JOB_KEY = ?];嵌套异常是 java.sql.SQLException:无效的对象名称 'BATCH_JOB_INSTANCE'。 在 org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:235) ~[spring-jdbc-5.2.5.RELEASE.jar:5.2.5.RELEASE] 在 org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72) ~[spring-jdbc-5.2.5.RELEASE.jar:5.2.5.RELEASE] 在 org.springframework.jdbc.core.JdbcTemplate.translateException(JdbcTemplate.java:1443) ~[spring-jdbc-5.2.5.RELEASE.jar:5.2.5.RELEASE] 在 org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:633) ~[spring-jdbc-5.2.5.RELEASE.jar:5.2.5.RELEASE] 在 org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:669) ~[spring-jdbc-5.2.5.RELEASE.jar:5.2.5.RELEASE] 在 org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:700) ~[spring-jdbc-5.2.5.RELEASE.jar:5.2.5.RELEASE] 在 org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:712) ~[spring-jdbc-5.2.5.RELEASE.jar:5.2.5.RELEASE] 在 org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:768) ~[spring-jdbc-5.2.5.RELEASE.jar:5.2.5.RELEASE] 在 org.springframework.batch.core.repository.dao.JdbcJobInstanceDao.getJobInstance(JdbcJobInstanceDao.java:151) ~[spring-batch-core-4.2.1.RELEASE.jar:4.2.1.RELEASE] 在 org.springframework.batch.core.repository.support.SimpleJobRepository.isJobInstanceExists(SimpleJobRepository.java:91) ~[spring-batch-core-4.2.1.RELEASE.jar:4.2.1.RELEASE] 在 sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)~[na:1.8.0_161] 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_161] 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_161] 在 java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_161] 在 org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344) ~[spring-aop-5.2.5.RELEASE.jar:5.2.5.RELEASE] 在 org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198) ~[spring-aop-5.2.5.RELEASE.jar:5.2.5.RELEASE] 在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.2.5.RELEASE.jar:5.2.5.RELEASE] 在 org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:366) ~[spring-tx-5.2.5.RELEASE.jar:5.2.5.RELEASE] 在 org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:118) ~[spring-tx-5.2.5.RELEASE.jar:5.2.5.RELEASE] 在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.2.5.RELEASE.jar:5.2.5.RELEASE] 在 org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212) ~[spring-aop-5.2.5.RELEASE.jar:5.2.5.RELEASE] 在 com.sun.proxy.$Proxy54.isJobInstanceExists(未知来源)~[na:na] 在 sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)~[na:1.8.0_161] 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_161] 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_161] 在 java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_161] 在 org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344) ~[spring-aop-5.2.5.RELEASE.jar:5.2.5.RELEASE] 在 org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198) ~[spring-aop-5.2.5.RELEASE.jar:5.2.5.RELEASE] 在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.2.5.RELEASE.jar:5.2.5.RELEASE] 在 org.springframework.batch.core.configuration.annotation.SimpleBatchConfiguration$PassthruAdvice.invoke(SimpleBatchConfiguration.java:127) ~[spring-batch-core-4.2.1.RELEASE.jar:4.2.1.RELEASE] 在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.2.5.RELEASE.jar:5.2.5.RELEASE] 在 org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212) ~[spring-aop-5.2.5.RELEASE.jar:5.2.5.RELEASE] 在 com.sun.proxy.$Proxy46.isJobInstanceExists(未知来源)~[na:na] 在 org.springframework.boot.autoconfigure.batch.JobLauncherCommandLineRunner.getNextJobParameters(JobLauncherCommandLineRunner.java:199) ~[spring-boot-autoconfigure-2.2.6.RELEASE.jar:2.2.6.RELEASE] 在 org.springframework.boot.autoconfigure.batch.JobLauncherCommandLineRunner.execute(JobLauncherCommandLineRunner.java:191) ~[spring-boot-autoconfigure-2.2.6.RELEASE.jar:2.2.6.RELEASE] 在 org.springframework.boot.autoconfigure.batch.JobLauncherCommandLineRunner.executeLocalJobs(JobLauncherCommandLineRunner.java:166) ~[spring-boot-autoconfigure-2.2.6.RELEASE.jar:2.2.6.RELEASE] 在 org.springframework.boot.autoconfigure.batch.JobLauncherCommandLineRunner.launchJobFromProperties(JobLauncherCommandLineRunner.java:153) ~[spring-boot-autoconfigure-2.2.6.RELEASE.jar:2.2.6.RELEASE] 在 org.springframework.boot.autoconfigure.batch.JobLauncherCommandLineRunner.run(JobLauncherCommandLineRunner.java:148) ~[spring-boot-autoconfigure-2.2.6.RELEASE.jar:2.2.6.RELEASE] 在 org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:784) [spring-boot-2.2.6.RELEASE.jar:2.2.6.RELEASE] ...省略了 10 个常见框架 原因:java.sql.SQLException:无效的对象名称 'BATCH_JOB_INSTANCE'。 在 net.sourceforge.jtds.jdbc.SQLDiagnostic.addDiagnostic(SQLDiagnostic.java:372) ~[jtds-1.3.1.jar:1.3.1] 在 net.sourceforge.jtds.jdbc.TdsCore.tdsErrorToken(TdsCore.java:2988) ~[jtds-1.3.1.jar:1.3.1] 在 net.sourceforge.jtds.jdbc.TdsCore.nextToken(TdsCore.java:2421) ~[jtds-1.3.1.jar:1.3.1]
提前致谢
Spring 批处理需要您数据库中的几个表才能 运行。因此,您需要预先手动创建这些表或告诉 Spring Boot 为您完成。
由于您通过设置 spring.batch.initialize-schema=never
告诉 Spring Boot 不为您创建这些表,因此您需要在目标数据源中自己创建它们。
因此在您的情况下,您需要 运行 DDL script 在 SQL 服务器实例 之前创建 Spring 批处理表 运行完成你的工作。
好吧,我已经删除了这一行并且我按照你的建议做了并且它起作用了,只有 dao 是 NullpointerException,它是接口并在 Itemprocessor 中使用:
</p>
<pre><code>@Bean
public BatchConfigurer configurer(@Qualifier("sqlserverDataSource") DataSource dataSource){
return new DefaultBatchConfigurer(){
// @Override
// protected JobRepository createJobRepository() throws Exception {
// JobRepositoryFactoryBean factory = new JobRepositoryFactoryBean();
// factory.setDataSource(dataSource);
// factory.setTransactionManager(transactionManager());
// // factory.setIsolationLevelForCreate("ISOLATION_READ_COMMITTED");
// //factory.setTablePrefix("dbo.tmpAccWebServ");
// //factory.setDatabaseType("SQLSERVER");
// //factory.setMaxVarCharLength(1000);
// return factory.getObject();
//// MapJobRepositoryFactoryBean mapJobRepositoryFactoryBean = new MapJobRepositoryFactoryBean(transactionManager());
//// mapJobRepositoryFactoryBean.setTransactionManager(transactionManager());
//// return mapJobRepositoryFactoryBean.getObject();
// }
//
// @Override
// protected JobLauncher createJobLauncher() throws Exception {
// SimpleJobLauncher jobLauncher = new SimpleJobLauncher();
// jobLauncher.setJobRepository(createJobRepository());
// jobLauncher.setTaskExecutor(new SimpleAsyncTaskExecutor());
// jobLauncher.afterPropertiesSet();
// return jobLauncher;
// }
@Override
public void setDataSource(DataSource dataSource) {
// override to do not set datasource even if a datasource exist.
// initialize will use a Map based JobRepository (instead of database)
} //
};
}//
这是 CustomerItemProcessor 的代码
</p>
<pre><code>public class CustomerItemProcessor implements ItemProcessor<beangenerico,ThreadLocal<CopyOnWriteArrayList<beanCustomer>>> {
@Autowired
private CustomerDAO customerDAO;
private ThreadLocal<CopyOnWriteArrayList<beanCustomer>> listbean = new ThreadLocal<CopyOnWriteArrayList<beanCustomer>>();
public ThreadLocal<CopyOnWriteArrayList<beanCustomer>> process(beangenerico rangos) throws Exception {
System.out.println("entro a customitemprocessor");
listbean.set(new CopyOnWriteArrayList<beanCustomer>());
System.out.println("rangos:"+rangos.getIni()+"-"+rangos.getFin());
listbean = customerDAO.getAccAgentes(rangos);
if(listbean != null) {
//customer.setId(currentCustomer.getId());
return listbean;
} else {
return null;
}
}
@Autowired
public void setCustomerDAO(CustomerDAOImpl customerDAO) {
this.customerDAO = customerDAO;
}
}
这是接口代码
</p>
<pre><code>public interface CustomerDAO {
ThreadLocal<CopyOnWriteArrayList<beanCustomer>> getAccAgentes(beangenerico bean);
}
这是 CustomerDAOImpl 的代码
</p>
<pre><code>@Repository
@Component
public class CustomerDAOImpl implements CustomerDAO{
private String SP_SQL = "{call mysp(?, ?)}";
@Autowired
@Qualifier("sqlserverDataSource")
DataSource dataSource;
@Autowired
JdbcTemplate jdbcTemplate;
public ThreadLocal<CopyOnWriteArrayList<beanCustomer>> getAccAgentes(beangenerico bean) {
...
//query resulset
}
public JdbcTemplate getJdbcTemplate() {
return jdbcTemplate;
}
}
在此先感谢您的帮助。