2010-09-20 20 views
9

Tôi nghĩ điều này phải dễ dàng. Phải có một số phương pháp cho việc này. Đây là những gì tôi muốn: -Làm thế nào để có được số lượng các lô trong chuẩn bị sẵn sàng?

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

kết quả sẽ là: totalbatches: 3;
Nếu không có phương pháp như vậy thì làm thế nào để làm điều này?

Trả lời

6

Chức năng này không được hỗ trợ. Nhưng bạn có thể bọc Statement và ghi đè addBatch() bằng cách thêm một thành viên đếm. Nếu sử dụng Apache Commons DBCP, bạn có thể kế thừa từ DelegatingPreparedStatement, nếu không bạn không có trình bao bọc cho PreparedStatement. Vì vậy, tôi đã sử dụng proxy để thêm phương thức:

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 sẽ trả về một mảng các số nguyên. Chỉ cần lấy chiều dài của mảng.

Nếu bạn cần số lượng lô trước khi nó được thực hiện, thì tôi đoán cách giải quyết duy nhất là tự tính nó mỗi lần bạn đã gọi bao nhiêu addBatch.

+3

Tôi nghĩ Rakesh muốn nhận số lượng lô trước khi thực thi. Nếu không bằng cách sử dụng executeBatch là OK. – rics

Các vấn đề liên quan