我正在尝试访问写入量很高的嵌入式数据库(H2)(10/秒,都是事件的计数器)。我需要在 1 分钟左右读取一次该数据。一旦读取,计数器应该被重置。
我正在尝试实现这种行为(伪代码):
//Writer thread
SELECT count FROM counters_db WHERE type="eventID1";
if count:
count++;
UPDATE counters_db SET count=count WHERE type="eventID1";
else:
INSERT INTO counters_db(eventID, count) VALUES(1, "eventID1")
//Reader thread
DATA = SELECT * FROM counters_db;
TRUNCATE TABLE counters_db;
process(DATA) <--Do something with the data
两个线程并行运行。
我看到的问题是:
writer 线程中的 SELECT-UPDATE-INSERT 范例对我来说看起来有问题。如果插入了某些内容并且不是阅读器线程中选择的一部分,我可以在阅读器线程中截断数据。
我相信有比更新计数更好的方法来处理这些数据,然后截断是清除它。也许只是插入值会起作用(即,编写器线程中的一个非常简单的逻辑,它只是插入)并且读取器线程将知道要处理哪些行(但是如何处理?)。这种方法还存在在嵌入式数据库中创建大量记录的风险。我该如何处理?
解决这个问题的最佳方法是什么?我错过了一些明显的东西?