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.