9
votes

BatchupDateException: le lot ne se terminera pas

J'ai une application qui traite un fichier très volumineux et envoie des données à une base de données Oracle (à l'aide de Java 6, Oracle 9).

dans une boucle, j'utilise un préparéystatement PS et crée toutes les instructions SQL générées avec ps.addbatch () .

J'ai une situation où un BatchupDateException BUE est lancé quelque part pendant le ps.executebatch () . À ce stade, le lot s'arrête à être exécuté.

J'aimerais que l'exécution par lots continue, de sorte que je puisse ensuite vérifier les mises à jour échouées dans une méthode processupdatocounts (BUE.GETUPDATECounts ()) . .

Le Javadoc sur la classe BatchupDateException dit:

après une commande dans une mise à jour du lot omet d'exécuter correctement et un BatchupDateException est lancé, le le conducteur peut ou peut ne pas continuer à traiter les commandes restantes dans le lot.

existe-t-il un moyen de faire respecter la continuation ou de modifier mon programme afin qu'il exécute la déclaration individuellement?


0 commentaires

4 Réponses :


0
votes

Étant donné que la spécification ne semble pas le mandater (comme indiqué clairement par le Javadoc), toute continuation "forcée" devrait être effectuée à la base du conducteur. Une solution de contournement simple compatible standard serait de vérifier le tableau getUpdatEcounts () Retour de la matrice et "Re-exécuter" le lot pour ces déclarations qui ont échoué. Vous pouvez faire cette approche un peu plus sophistiquée en mettant dans une logique pour le nombre de tentatives.

Bien sûr, cela semble un peu désordonné (suivre la trace du "lot" ajouté, puis vérifiant la sortie) mais fonctionnerait dans toutes les bases de données et toutes les implémentations de pilote. Juste une pensée ...


0 commentaires

5
votes

vient de trouver ce lien: Problème de mise à jour de lots JDBC

Apparemment, il est dit qu'il y a

aucun moyen avec oracle lot jdbc pour procéder après la première échec ,

Je suis donc recours à l'envoi des insertions un par un. Merci

(Désolé de ne pas avoir l'air mieux de trouver le lien ci-dessus avant).


0 commentaires

3
votes

Il y a une solution de contournement qui vous permettrait d'utiliser la fonction de lot. Au lieu d'exécuter une instruction d'insertion simple, vous pouvez exécuter un bloc PL / SQL qui traitera de l'erreur de manière appropriée:

BEGIN
   INSERT INTO your_table VALUES (?,?,...?);
EXCEPTION
   WHEN OTHERS THEN
      /* deal with the error. For example, log the error id and error msg 
         so that you can list them after the batch */
      INSERT INTO error_table VALUES (?, sqlerrm);
END


0 commentaires

1
votes

Oracle lui-même peut, voir ici: HTTP : ///download.oracle.com/docload/b19306_01/AppDev.102/b14250/oci04sql.htm#sSthref616

Cependant, il ne semble pas que cette fonctionnalité soit exposée à JDBC, pas même dans les classes spécifiques à Oracle.

En raison de la gestion des erreurs de JDBC plutôt inutiles ("Le pilote peut ou ne peut pas continuer"), je définit toujours une note de sauvegarde avant le lot et effectue un retour sur ce point sur l'erreur. C'est le seul moyen conforme JDBC d'établir un état connu après une erreur par lot oracle - autant que je sache.


0 commentaires