gpt4 book ai didi

java - 使用 LinkedBlockingQueue 并刷新到 mysql

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:23:54 24 4
gpt4 key购买 nike

linkedblockingqueue 是否适合以下情况:

1. insert strings (maximum 1024 bytes) into the queue at a very high rate
2. every x inserts or based on a timed interval, flush items into mysql

在冲洗过程中,我正在查看 API:http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/LinkedBlockingQueue.html

At 想知道 drainTo 会是一个不错的选择,因为我必须在冲洗前进行聚合。

所以我会drainTo队列中的项目,然后迭代和聚合然后写入mysql。

这是否适合每秒多达 10,000 个写入者?

我是否需要考虑任何锁定/同步问题,或者是否已经解决了这些问题?

我会将此 linkedblockingqueue 存储为并发 HashMap 中的值。

项目永远不会从 HashMap 中删除,只有在不存在时才插入,如果存在,我将追加到队列中。

最佳答案

这取决于插入器是按队列还是针对所有队列。如果我理解您的规范,我认为类似以下的内容会起作用。

Writer 将一个项目添加到 map 中的 LinkedBlockingQueue 集合之一。如果队列的大小大于 X(如果你希望每个队列都有),那么它会向 MySQL 插入器线程发出信号。这样的事情应该有效:

queue.add(newItem);
// race conditions here that may cause multiple signals but that's ok
if (queue.size() > 1000) {
// this will work if there is 1 inserter per queue
synchronized (queue) {
queue.notify();
}
}
...

然后插入器在队列中等待,并在类似下面的循环中:

List insertList = new ArrayList();
while (!done) {
synchronized (queue) {
// typically this would be while but if we are notified or timeout we insert
if (queue.size() < 1000) {
queue.wait(MILLIS_TIME_INTERVAL);
}
}
queue.drainTo(insertList);
// insert them into the db
insertList.clear();
}

如果有 1 个线程在所有队列中执行插入,它会变得有点复杂。我想问题是为什么你有 ConcurrentHashMap 呢?如果您确实有一个插入器,例如,它正在插入多个表或其他东西,那么您将需要一种机制来通知插入器哪个队列需要被清空。它可以只遍历 map 中的所有队列,但这可能很昂贵。您将在某些全局锁对象或 map 对象而不是队列上进行同步。

哦,正如@Peter Lawrey 提到的,如果您的数据库比编写器慢,您将很快耗尽内存,因此请确保队列具有适当的容量设置,以便它们限制编写器并降低工作内存。

希望这对您有所帮助。

关于java - 使用 LinkedBlockingQueue 并刷新到 mysql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8716423/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com