5 votes

Java JDBC clearBatch() et la mémoire de pile

J'ai remarqué le comportement suivant.

J'ai un fichier d'environ 3 Mo contenant plusieurs milliers de lignes. Dans ces lignes, je divise et crée des instructions préparées (environ 250 000 instructions).

Ce que je fais, c'est :

preparedStatement
addBatch
do for every 200 rows {
 executeBatch
 clearBatch().
}

à la fin

commit()

L'utilisation de la mémoire augmente jusqu'à environ 70 mb sans erreur de mémoire. Est-il possible de réduire l'utilisation de la mémoire ? et d'avoir le comportement transactionnel (si un échec, tous les échecs.). J'ai pu réduire la mémoire en faisant un commit avec l'option executeBatch et clearBatch ... mais cela entraînera une insertion partielle de l'ensemble.

2voto

stacker Points 34209

Vous pouvez insérer toutes les lignes dans une table temporaire avec la même structure et si tout va bien, laissez la base de données les insérer dans la table cible en utilisant : insert into target (select * from temp) . Si l'importation dans la table temporaire échoue, vous n'avez rien changé dans votre table cible.

EDIT : correction de la syntaxe

-1voto

xxx Points 1541

Vous pouvez également utiliser la fonction de "traitement par lots" de JDBC 2.0.

  1. Définissez votre connexion à la base de données en utilisant connection.setAutoCommit(false)
  2. Ajoutez des lots à votre relevé en utilisant statement.addBatch(sql_text_here)
  3. Une fois que vos lots sont tous chargés, exécutez-les en utilisant : statement.executeBatch()
  4. L'engager en utilisant connection.commit()
  5. Attrapez les exceptions et revenez en arrière si nécessaire en utilisant connection.rollback()

Plus de détails sur la gestion des exceptions pour le retour en arrière... voici un gestionnaire d'exception typique pour le retour en arrière :

  catch( BatchUpdateException bue )
  {
    bError = true;
    aiupdateCounts = bue.getUpdateCounts();

    SQLException SQLe = bue;
    while( SQLe != null)
    {
      // do exception stuff

      SQLe = SQLe.getNextException();
    }
  } // end BatchUpdateException catch
  catch( SQLException SQLe )
  {
    ...

  } // end SQLException catch

Lisez la suite ici : http://java.sun.com/developer/onlineTraining/Database/JDBC20Intro/JDBC20.html#JDBC2015

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X