Spring Batch Framework - Автоматическое создание Batch Table

Я только что создал пакетное задание с использованием среды Spring Batch, но у меня нет привилегий базы данных для запуска 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, я просто хочу проверить правильность работы моего устройства чтения и записи.

12 ответов

Решение

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

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

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

С Spring Boot 2.0 вам, вероятно, понадобится следующее: https://docs.spring.io/spring-boot/docs/2.0.0.M7/reference/htmlsingle/

spring.batch.initialize-schema=always

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

Или же

 spring.batch.initialize-schema=never

Чтобы навсегда отключить его.

Spring Batch необходимы следующие таблицы для запуска задания

  • BATCH_JOB_EXECUTION
  • BATCH_JOB_EXECUTION_CONTEXT
  • BATCH_JOB_EXECUTION_PARAMS
  • BATCH_JOB_EXECUTION_SEQ
  • BATCH_JOB_INSTANCE
  • BATCH_JOB_SEQ
  • BATCH_STEP_EXECUTION
  • BATCH_STEP_EXECUTION_CONTEXT
  • BATCH_STEP_EXECUTION_SEQ

Если вы используете h2 db, он по умолчанию создаст всю необходимую таблицу

  • spring.h2.console.enabled= true
  • spring.datasource.url=jdbc:h2:mem:testdb
  • spring.datasource.driverClassName=org.h2.Driver
  • spring.datasource.username= sa
  • spring.datasource.password=
  • spring.jpa.database-platform=org.hibernate.dialect.H2Dialect

Когда вы начинаете использовать Mysql или любую другую базу данных, вам необходимо добавить следующие свойства в application.properties

               spring.batch.initialize-schema=always

Начиная с Spring Boot 2.5.0 используйте

      # to always initialize the datasource:
spring.batch.jdbc.initialize-schema=always

# to only initialize an embedded datasource:
spring.batch.jdbc.initialize-schema=embedded

# to never initialize the datasource:
spring.batch.jdbc.initialize-schema=never

( spring.batch.initialize-schema устарело с версии 2.5.0 для удаления в 2.7.0)

Чтобы включить автоматическое создание схемы данных Spring, просто добавьте эту строку в файл spring application.properties:

spring.batch.initialize-схема = всегда

Чтобы больше узнать о схеме метаданных Spring, выполните следующие действия.

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

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

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

неправильная грамматика SQL [SELECT JOB_INSTANCE_ID, JOB_NAME из BATCH_JOB_INSTANCE, где JOB_NAME =? и JOB_KEY =?]

а также:

Неверное имя объекта 'BATCH_JOB_INSTANCE'

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

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

При работе с Spring Boot:

Running with Spring Boot v1.5.14.RELEASE, Spring v4.3.18.RELEASE

Этого должно быть достаточно:

spring:
    batch:
        initializer:
            enabled: false

Схема инициализации не работала для этой загрузочной версии Spring. После этого я смог скопировать сценарии SQL из подпружиненного фляги и изменить заглавную букву таблицы, так как это было моей проблемой с автоматическим созданием таблицы под Windows/Mac/Linux.

<?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>

И убедитесь, что вы используете совместимый spring-jdbc -version с spring-batch. Скорее всего, совместим с spring-jdbc-3.2.2.RELEASE.JAR.

Это работает для меня: Spring boot 2.0

  batch:
        initialize-schema: never
        initializer:
            enabled: false

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

В вашем DataSourceConfig вы должны добавить этот код. Как только приложение появится, оно удалит любую существующую схему или создаст новую.

      private DataSource dataSource() {
    EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();
    return builder.setType(EmbeddedDatabaseType.HSQL)
      .addScript("classpath:org/springframework/batch/core/schema-drop-h2.sql")
      .addScript("classpath:org/springframework/batch/core/schema-h2.sql")
      .build();
}

Если вы не можете этого сделать, значит, сценарии схемы находятся в вашей папке .m2. Запустите скрипты вручную. Расположение внутри банки spring-batch-core.

C:\Users\XXX.m2\repository\org\springframework\batch\spring-batch-core\4.3.7.

Разделите эту банку и найдите нужный сценарий схемы sql.

  • org\springframework\batch\core\schema-h2.sql.
  • org\springframework\batch\core\schema-drop-h2.sql.

Используйте следующий параметр, поскольку предложенный выше устарел:

spring.batch.jdbc.initialize-schema= всегда

Другие вопросы по тегам