2010-09-20 13 views

Respuesta

6

Esta funcionalidad no es compatible. Pero puede envolver la Declaración y anular addBatch() agregando un miembro de conteo. Si usa Apache Commons DBCP, puede heredar de DelegatingPreparedStatement, de lo contrario, no tiene un contenedor para PreparedStatement. Así que utilicé un proxy para agregar el método:

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 devolverá una matriz de enteros. Solo toma la longitud de la matriz.

Si necesita el número de lotes antes de que se ejecute, entonces supongo que la única solución es contarlo usted mismo cada vez cuántos addBatch ha llamado.

+3

Creo que a Rakesh le gustaría obtener el número de lotes antes de la ejecución. De lo contrario, utilizar executeBatch es correcto. – rics

Cuestiones relacionadas