Как получить количество партий в preparedstatement?
Я думаю, что это должно быть легко. Для этого должен быть какой-то метод. Вот чего я хочу: -
PreparedStatement ps = ...
ps.addBatch ( );
ps.addBatch ( );
ps.addBatch ( );
logger.info ( "totalBatches: " + ps.someMethod() );
ps.executeBatch ( );
результат будет: totalbatches: 3;
Если такого метода нет, то как это сделать?
2 ответов
эта функция не поддерживается. Но вы можете обернуть оператор и переопределить addBatch (), добавив элемент подсчета. При использовании Apache Commons DBCP, вы можете наследовать от DelegatingPreparedStatement
, иначе у вас нет обертки для PreparedStatement
. Поэтому я использовал прокси для добавления метода:
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();
}
}
executeBatch
возвращает массив целых чисел. Просто возьмите длину массива.
Если вам нужно количество пакетов до его выполнения, то я думаю, что единственным обходным путем является подсчет его каждый раз, сколько addBatch вы вызвали.