2010-09-20 2 views
9

Je pense que cela doit être facile. Il doit y avoir une méthode pour cela. C'est ce que je veux: -Comment obtenir le nombre de lots dans preparedstatement?

PreparedStatement ps = ... 
ps.addBatch (); 
ps.addBatch (); 
ps.addBatch (); 
logger.info ("totalBatches: " + ps.someMethod()); 
ps.executeBatch (); 

le résultat sera: totalbatches: 3;
S'il n'y a pas une telle méthode alors comment faire cela?

Répondre

6

Cette fonctionnalité n'est pas prise en charge. Mais vous pouvez envelopper la déclaration et remplacer addBatch() en ajoutant un membre de comptage. Si vous utilisez Apache Commons DBCP, vous pouvez hériter de DelegatingPreparedStatement, sinon vous ne disposez pas d'un wrapper pour PreparedStatement. J'ai donc utilisé un proxy pour ajouter la méthode:

public class BatchCountingStatementHandler implements InvocationHandler { 

    public static BatchCountingStatement countBatches(PreparedStatement delegate) { 
    return Proxy.newProxyInstance(delegate.getClassLoader(), new Class[] {BatchCountingStatement.class}, new BatchCountingStatementHandler(delegate)); 
    } 

    private final PreparedStatement delegate; 
    private int count = 0; 

    private BatchCountingStatementHandler(PreparedStatement delegate) { 
    this.delegate = delegate; 
    } 

    public Object invoke(Object proxy, Method method, Object[] args) 
    throws Throwable { 
    if ("getBatchCount".equals(method.getName())) { 
     return count; 
    } 
    try { 
     return method.invoke(delegate, args); 
    } finally { 
     if ("addBatch".equals(method.getName())) { 
     ++count; 
     } 
    } 
    } 

    public static interface BatchCountingStatement extends PreparedStatement { 
    public int getBatchCount(); 
    } 
} 
3

executeBatch retournera un tableau d'entiers. Prends juste la longueur du tableau.

Si vous avez besoin du nombre de lots avant de l'exécuter, je suppose que la seule solution consiste à le compter vous-même à chaque fois combien d'addBatch vous avez appelé.

+3

Je pense que Rakesh aimerait obtenir le nombre de lots avant l'exécution. Sinon, l'utilisation de executeBatch est OK. – rics

Questions connexes