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; } }

在此先感谢您的帮助。