1

我正在寻找 java 并发解决方案,以便我可以使用 JDBC 批量更新。BlockingQueue 每次都会让我一个项目,我已经有方法对 DAO 进行批量更新,但我需要一些解决方案,以便我可以利用 JDBC 批量更新而不是单个记录更新。

我的工作线程如下所示:

class DBWorker extends Thread {
    @Override
    public void run() {
        try {
            while (true) {
                try {
                    Pair<Long, Status> p = dbQ.take();
                    //--
                    orderDao.updateStatus(p.getLeft(), p.getRight());
                } catch (InterruptedException e) {
                    log.error(e);
                }
            }
        } catch (Exception e) {
            log.error(e);
        } finally {

        }
    }
}
4

2 回答 2

2

基本上,您需要做的是将多个Pair对象收集到 aCollection中,然后将其传递Collection给将执行批量更新的代码。

您可以尝试以下方法:

while (true) {
    Pair<Long, Status> p = dbQ.take();
    List<Pair> collectedPairs = new ArrayList();
    while (p!=null) {
        collectedPairs.add(p);
        p = dbQ.poll();
    }
    orderDao.batchUpdate(collectedPairs);
}

然而,上面的代码将主要发布通常较小的批次。您可以调整该示例以使用定时轮询方法BlockingQueue.poll(long, TimeUnit)来引入一些延迟并尝试收集更大的批处理大小。

于 2013-03-20T03:46:42.907 回答
2

BlockingQueue有一个很好的方法,drainTo()它基本上将所有条目放入一个集合中。虽然它没有阻塞,但在调用它之前你仍然需要 a take(),这样它就不会忙着等待。除了更新一个和一个,您还需要一种批量更新数据库的方法。例如:

ArrayList<Pair<Long, Status>> list = new ArrayList<Pair<Long, Status>>();
list.add(dbQ.take());
//sleep(int n) - if you want to wait for more entries before submitting the batch - otherwise batches will probably be pretty small..
dbQ.drainTo(list);
orderDao.updateInBatch(list);
于 2013-03-20T03:47:45.327 回答