我有一个计费守护进程,它必须以非常快速的方式处理数十万条数据。我实现ExecutorSerivce
了并行处理。它确实提高了速度,但不是很多。处理 1,00,000 条记录大约需要 2.5-3 小时。我怎样才能让它更快,比如在半小时内处理这些数据?
我为执行设置编写了以下内容:
-Xms2048M -Xmx2048M -XX:MaxPermSize=256m
我试图用 1 个生产者和 4 个消费者来实现一个生产者消费者模型。每个列表可以包含 10,000 条记录。
ArrayBlockingQueue<BillableList> list =new ArrayBlockingQueue<BillableList>(10);
ExecutorService threadPool = Executors.newFixedThreadPool(5);
threadPool.execute(new Consumer("pool1", list));
threadPool.execute(new Consumer("pool2", list));
threadPool.execute(new Consumer("pool3", list));
threadPool.execute(new Consumer("pool4", list));
Future producerStatus = threadPool.submit(new Producer("Producer", list));
producerStatus.get();
threadPool.shutdown();
在将记录更新到数据库时,我还会收到很多“超出数据库锁定等待超时”异常。是不是因为不同的消费者同时尝试为同一个用户?如何让不同的消费者从ArrayBlockingQueue
列表中获取不同的数据?