2009-03-04 9 views
1

Je cherche à réduire les allers-retours dans mon application pour améliorer les performances. Je veux utiliser PreparedStatement s pour leur multitude d'avantages.SQL: Instructions groupées avec variables liées

Voici un exemple de ce que je suis venu avec .. généralisée avec des détails élidés ..

Class.forName("..Driver"); 
    Connection connection = DriverManager.getConnection(..);  
    PreparedStatement statement = connection.prepareStatement("UPDATE Table SET XmlData = ? WHERE SomeGUID = ?; INSERT INTO SomeTable (Col1,Col2) VALUES (?, ?)"); 

    try{ 
    statement.setString(1, "<XmlData></XmlData>"); 
    statement.setString(2, "32ABD5-438B0-.."); 
    statement.setString(3, "ABC"); 
    statement.setString(4, "XYZ"); 
    statement.execute(); 
    connection.commit(); 
    } 
    catch { 
    connection.rollback(); 
    } 
    finally { 
    statement.close(); 
    connection.close(); 
    } 

(Encore une fois, ce n'est pas le code réel, juste un exemple simplifié)

En général, j'essaie d'exécuter plusieurs instructions d'insertion/mise à jour dans une instruction unique afin de réduire le trafic aller-retour. Est-ce un moyen efficace de le faire ou existe-t-il une approche plus acceptée?

Je pourrais avoir des milliers d'instructions pour une seule transaction. Je vais probablement segmenter l'instruction en blocs de taille raisonnable pour éviter les délais d'attente sur l'exécution d'une seule instruction.

Je prendrai en charge plusieurs fournisseurs de bases de données, mais j'utiliserai SQL ANSI pour qu'il n'y ait pas de problème. Si nécessaire, je peux tirer parti de l'intelligence de mon DAL. Donc, ceci est un non-problème.

Des astuces/suggestions?

Répondre

0

PreparedStatement prend en charge la soumission par lots de la même instruction avec différents arguments en utilisant addBatch et executebatch. Je ne pense pas qu'il existe un bon moyen d'exécuter plusieurs instructions paramétrées dans une plate-forme de base de données croisée. Traditionnellement, cela serait géré par [mal] procs stockés.

2

Voici un exemple du manuel JDBC d'Oracle. Ceci est décrit comme la méthode "standard" (non spécifique à Oracle).

PreparedStatement pstmt = 
      conn.prepareStatement("INSERT INTO employees VALUES(?, ?)"); 

pstmt.setInt(1, 2000); 
pstmt.setString(2, "Milo Mumford"); 
pstmt.addBatch(); 

pstmt.setInt(1, 3000); 
pstmt.setString(2, "Sulu Simpson"); 
pstmt.addBatch(); 
... 
int[] updateCounts = pstmt.executeBatch(); 
1

Soit dit en passant, si vous; re préoccupé peformance, vous devriez envisager d'utiliser un ensemble de mise en commun de connexion comme dbcp qui soutiendra également la mise en commun PreparedStatement. c3p0 est également populaire mais je n'ai aucune expérience avec elle.

Questions connexes