Spring Пакетная структура - автоматическое создание таблицы пакетов

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

Ответ 1

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

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

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

Ответ 2

С 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

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

Ответ 3

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

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

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

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

Ответ 4

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

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

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

а также:

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

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

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

Ответ 5

Тег

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

Ответ 6

<?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 -версию с spring -batch. Скорее всего, spring -jdbc-3.2.2.RELEASE.JAR.

Ответ 7

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

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

Ответ 8

При работе с 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.