【发布时间】:2019-02-08 17:22:10
【问题描述】:
我需要创建一个列表来执行以下操作:
- 我每微秒从外部队列/主题接收一个对象。
- 对对象进行一些操作后,我需要将这些对象持久化到数据库中。
- 我正在进行 100 或 1000 批次的持久化。唯一的问题是,持久化率低于传入消息率。现在我不想将其保留在单个线程中,因为持久化会减慢消息消耗。
- 我的想法是继续接受消息对象并将它们添加到集合中(如链表)
- 并继续以 100 或 1000 个为一组从集合的另一端删除并持久化到数据库中。
- 什么是正确的集合使用?如何同步这个,避免并发修改异常?
下面是我尝试使用 ArrayList 实现的代码,该 ArrayList 在持久化时每隔几秒清除一次列表。
class myclass{
List persistList;
ScheduledExecutorService persistExecutor;
ScheduledFuture scheduledFuture;
PersistOperation persistOperation;
//Initialize delay, interval
void init(){
scheduledFuture=persistExecutor.scheduleAtFixedRate(new persistOperation(persistList), delay, interval, TimeUnit.SECONDS);
}
void execute(msg){
//process the message and add to the persist list
}
class PersistOperation implements Runnable{
List persistList
PersistOperation(List persistList){
//Parameterized constructor
}
run(){
//Copy persistList to new ArrayList and clear persistList
//entity manager persist/update/merge
}
}
}
【问题讨论】:
标签: java database multithreading collections persist