Spring Batch Framework - автоматическое создание таблицы пакетов

Я только что создал пакетное задание с помощью Spring Batch framework, но у меня нет прав базы данных для запуска CREATE SQL. Когда я пытаюсь запустить пакетное задание, я попал в ошибку, когда платформа пыталась создать TABLE_BATCH_INSTANCE. Я пытаюсь отключить

<jdbc:initialize-database data-source="dataSource" enabled="false">    
 ...
</jdbc:initialize-database>

но после того, как я попытался, я все еще попал в ошибку

org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [SELECT JOB_INSTANCE_ID, JOB_NAME from BATCH_JOB_INSTANCE where JOB_NAME = ? and JOB_KEY = ?]; nested exception is java.sql.SQLSyntaxErrorException: ORA-00942: table or view does not exist

в любом случае можно отключить SQL, я просто хочу проверить правильность работы моего читателя и процессора.

6 ответов


Spring Batch использует базу данных для сохранения метаданных для функции восстановления/повторной попытки.

Если вы не можете создать таблицы в базе данных вы должны отключить это поведение

Если вы можете создать таблицы метаданных пакета, но не во время выполнения, вы можете создать их вручную


С Spring Boot 2.0 вам, вероятно, это нужно: https://docs.spring.io/spring-boot/docs/2.0.0.M7/reference/htmlsingle/#howto-initialize-a-spring-batch-database

spring.batch.initialize-schema=always

по умолчанию он будет только создавать таблицы, если вы используете встроенную базу данных.

или

 spring.batch.initialize-schema=never

полностью отключить его.


кажется глупым, но у кого-то может быть такая же проблема.

Я получал эту ошибку после удаления всех таблиц из базы данных. Когда я попытался запустить весеннюю партию, я получил сообщение об ошибке:

плохая грамматика SQL [выберите JOB_INSTANCE_ID, JOB_NAME из BATCH_JOB_INSTANCE, где JOB_NAME = ? и JOB_KEY = ?]

и:

недопустимое имя объекта 'BATCH_JOB_INSTANCE'

Это случилось со мной, потому что Я!--15-->отбросьте таблицы без перезапуска службы. Служба запущена и получает метаданные базы данных С пакетные таблицы в базе данных. После их удаления и не перезагрузки сервера весенний пакет думал, что таблицы все еще существуют.

после перезагрузки сервера Spring Batch server и повторного выполнения пакета таблицы были созданы без ошибок.


чтобы включить автоматическое создание spring batch data-schema просто добавьте эту строку в приложение spring.файл свойств:

весна.партия.initialize-schema=всегда

чтобы узнать больше о схеме метаданных Spring batch:

https://docs.spring.io/spring-batch/trunk/reference/html/metaDataSchema.html


<jdbc:initialize-database/> тег анализируется весной с помощью InitializeDatabaseBeanDefinitionParser. Вы можете попробовать отладить этот класс в своей IDE, чтобы убедиться, какие значения подбираются для . Также это значение можно отключить с помощью параметра JVM -Dspring.batch.initializer.enabled=false


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
        http://www.springframework.org/schema/jdbc 
        http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd">


    <!-- database -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://localhost:3306/springbatch" />
        <property name="username" value="root" />
        <property name="password" value="" />
    </bean>

    <!-- transaction manager -->
    <bean id="transactionManager" class="org.springframework.batch.support.transaction.ResourcelessTransactionManager" />

    <!-- create job-meta tables automatically -->
    <jdbc:initialize-database data-source="dataSource">
        <jdbc:script location="org/springframework/batch/core/schema-drop-mysql.sql" />
        <jdbc:script location="org/springframework/batch/core/schema-mysql.sql" />
    </jdbc:initialize-database>
</beans>

и убедитесь, что вы используете совместимое весна-jdbc -версия с весна-пакета. Скорее всего весна-jdbc-3.2.2.ОСВОБОЖДАТЬ.Джар совместимость.