Ich habe gerade einen Batch-Job mit dem Spring Batch-Framework erstellt, aber ich habe keine Datenbankberechtigungen zum Ausführen von CREATE SQL. Beim Versuch, den Batch-Job auszuführen, ist der Fehler aufgetreten, während das Framework versucht hat, TABLE_BATCH_INSTANCE zu erstellen. Ich versuche das zu deaktivieren
<jdbc:initialize-database data-source="dataSource" enabled="false">
...
</jdbc:initialize-database>
Aber nachdem ich es versucht habe, bin ich trotzdem auf den Fehler gestoßen
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
Auf jeden Fall kann SQL deaktiviert werden, ich möchte nur testen, ob Reader, Writer und Prozessor ordnungsgemäß funktionieren.
Spring Batch verwendet die Datenbank, um Metadaten für die Wiederherstellungs-/Wiederholungsfunktion zu speichern.
Wenn Sie keine Tabellen in der Datenbank erstellen können, dann Sie müssen dieses Verhalten deaktivieren
Wenn Sie die Batch-Metadatentabellen erstellen können, jedoch nicht zur Laufzeit, können Sie manuell erstellen
Mit Spring Boot 2.0 benötigen Sie wahrscheinlich Folgendes: https://docs.spring.io/spring-boot/docs/2.0.0.M7/reference/htmlsingle/#howto-initialize-a-spring-batch- Datenbank
spring.batch.initialize-schema=always
Standardmäßig werden die Tabellen nur erstellt, wenn Sie eine eingebettete Datenbank verwenden.
Oder
spring.batch.initialize-schema=never
Um es dauerhaft zu deaktivieren.
Um die automatische Erstellung des Datenschemas für die Frühlingsstapel zu aktivieren, fügen Sie einfach diese Zeile zu Ihrer Datei spring application.properties hinzu:
spring.batch.initialize-schema = always
Um mehr über das Spring-Batch-Metadatenschema zu erfahren, gehen Sie wie folgt vor:
https://docs.spring.io/spring-batch/trunk/reference/html/metaDataSchema.html
Scheint albern, aber jemand kann das gleiche Problem haben.
Ich habe diesen Fehler erhalten, nachdem ich alle Tabellen aus einer Datenbank gelöscht habe. Als ich versuchte, den Frühlingsstapel zu starten, erhielt ich die Fehlermeldung:
schlechte SQL-Grammatik [SELECT JOB_INSTANCE_ID, JOB_NAME from BATCH_JOB_INSTANCE where JOB_NAME =? und JOB_KEY =?]
und:
Ungültiger Objektname "BATCH_JOB_INSTANCE"
Dies ist mir passiert, weil ich die Tabellen löschen, ohne den Dienst neu zu starten. Der Dienst wurde gestartet und erhielt die Datenbank-Metadaten mit der Batch-Tabellen in der Datenbank. Nachdem sie gelöscht und der Server nicht neu gestartet wurde, war der Spring Batch der Ansicht, dass die Tabellen noch vorhanden sind.
Nach dem Neustart des Spring Batch-Servers und der erneuten Ausführung des Batchs wurden die Tabellen fehlerfrei erstellt.
<?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>
Und stellen Sie sicher, dass Sie kompatible spring-jdbc -Version mit spring-batch verwenden. Höchstwahrscheinlich spring-jdbc-3.2.2.RELEASE.JAR kompatibel.
Beim Laufen mit Spring Boot:
Running with Spring Boot v1.5.14.RELEASE, Spring v4.3.18.RELEASE
Das sollte reichen:
spring:
batch:
initializer:
enabled: false
Das Initialisierungsschema funktionierte für diese Spring-Boot-Version nicht. Danach konnte ich die SQL-Skripte aus dem Spring-Core-Jar kopieren und die Groß- und Kleinschreibung der Tabelle ändern, da dies mein Problem bei der automatischen Tabellenerstellung unter Windows/Mac/Linux war.
Das <jdbc:initialize-database/>
- Tag wird von Spring mit InitializeDatabaseBeanDefinitionParser
analysiert. Sie können versuchen, diese Klasse in Ihrem IDE zu debuggen, um sicherzustellen, welche Werte für das enabled
-Attribut erfasst werden. Dieser Wert kann auch mithilfe des JVM-Parameters -Dspring.batch.initializer.enabled=false
das funktioniert bei mir: spring boot 2.0
batch:
initialize-schema: never
initializer:
enabled: false