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= всегда