Как узнать количество партий в подготовленном заявлении? - PullRequest
9 голосов
/ 20 сентября 2010

Я думаю, это должно быть легко. Там должен быть какой-то метод для этого. Это то, что я хочу: -

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

результат будет: общее количество партий: 3;
Если такого метода нет, то как это сделать?

Ответы [ 2 ]

6 голосов
/ 20 сентября 2010

Эта функциональность не поддерживается. Но вы можете обернуть оператор и переопределить 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();
  }
}
3 голосов
/ 20 сентября 2010

executeBatch вернет массив целых чисел.Просто возьмите длину массива.

Если вам нужно количество пакетов перед его выполнением, то я думаю, что единственный обходной путь - подсчитывать его каждый раз, сколько addBatch вы вызвали.

...