web-dev-qa-db-fra.com

Spring Batch Framework - Création automatique d'une table de lots

Je viens de créer un travail par lots à l'aide du framework Spring Batch, mais je n'ai pas les privilèges de base de données pour exécuter CREATE SQL. Lorsque j'essaie d'exécuter le travail par lots, j'ai rencontré l'erreur pendant que le framework tentait de créer TABLE_BATCH_INSTANCE. J'essaie de désactiver le

<jdbc:initialize-database data-source="dataSource" enabled="false">    
 ...
</jdbc:initialize-database>

Mais après avoir essayé, j'ai quand même rencontré l'erreur

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

Quoi qu'il en soit, je peux désactiver le SQL, je veux juste tester le fonctionnement de mon lecteur/enregistreur et de mon processeur.

20
Einn Hann

Spring Batch utilise la base de données pour enregistrer les métadonnées pour sa fonctionnalité de récupération/nouvelle tentative.

Si vous ne pouvez pas créer de tables dans la base de données alors vous devez désactiver ce comportement

Si vous pouvez créer les tables de métadonnées par lots mais pas pendant l'exécution, alors vous pourriez les créer manuellement

13
Sergio

Avec Spring Boot 2.0, vous en aurez probablement besoin: https://docs.spring.io/spring-boot/docs/2.0.0.M7/reference/htmlsingle/#howto-initialize-a-spring-batch- base de données

spring.batch.initialize-schema=always

Par défaut, il ne créera les tables que si vous utilisez une base de données intégrée.

Ou

 spring.batch.initialize-schema=never

Pour le désactiver définitivement.

26
Pim Hazebroek

Pour activer la création automatique d'un schéma de données par lots Spring, ajoutez simplement cette ligne à votre fichier Spring application.properties:

spring.batch.initialize-schema = toujours

Pour en savoir plus sur le schéma de métadonnées par lots de Spring:

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

5
BlaCk HoLe

Cela semble idiot, mais quelqu'un peut avoir le même problème.

Je recevais cette erreur après avoir supprimé toutes les tables d'une base de données. Lorsque j'ai essayé de démarrer le Spring Batch, j'ai reçu l'erreur:

mauvaise grammaire SQL [SELECT JOB_INSTANCE_ID, JOB_NAME from BATCH_JOB_INSTANCE where JOB_NAME =? et JOB_KEY =?]

et:

Nom d'objet non valide 'BATCH_JOB_INSTANCE'

Cela m'est arrivé parce que je supprime les tables sans redémarrer le service. Le service a été démarré et reçoit les métadonnées de la base de données avec les tables de lots de la base de données. Après les avoir déposés et ne pas redémarrer le serveur, le Spring Batch a pensé que les tables existaient toujours.

Après avoir redémarré le serveur Spring Batch et exécuté à nouveau le lot, les tables ont été créées sans erreur.

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

Et assurez-vous que vous utilisez compatible spring-jdbc -version avec spring-batch. Très probablement spring-jdbc-3.2.2.RELEASE.JAR compatible.

0
Shalika

Lors de l'exécution avec Spring Boot:

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

Cela devrait suffire:

spring:
    batch:
        initializer:
            enabled: false

Le schéma d'initialisation n'a pas fonctionné pour cette version de démarrage Spring. Après cela, j'ai pu copier les scripts SQL à partir du pot Spring-core et changer la capitalisation de la table car c'était mon problème avec la création automatique de table sous Windows/Mac/Linux.

0
Investigator

<jdbc:initialize-database/> la balise est analysée par Spring en utilisant InitializeDatabaseBeanDefinitionParser. Vous pouvez essayer de déboguer cette classe dans votre IDE pour vous assurer des valeurs récupérées pour l'attribut enabled. Cette valeur peut également être désactivée à l'aide du paramètre JVM -Dspring.batch.initializer.enabled=false

0
Shailendra

cela fonctionne pour moi: Spring boot 2.0

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