1

我正在尝试访问写入量很高的嵌入式数据库(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

两个线程并行运行。

我看到的问题是:

  1. writer 线程中的 SELECT-UPDATE-INSERT 范例对我来说看起来有问题。如果插入了某些内容并且不是阅读器线程中选择的一部分,我可以在阅读器线程中截断数据。

  2. 我相信有比更新计数更好的方法来处理这些数据,然后截断是清除它。也许只是插入值会起作用(即,编写器线程中的一个非常简单的逻辑,它只是插入)并且读取器线程将知道要处理哪些行(但是如何处理?)。这种方法还存在在嵌入式数据库中创建大量记录的风险。我该如何处理?

解决这个问题的最佳方法是什么?我错过了一些明显的东西?

4

1 回答 1

0

对于#1,(忽略读取器线程)您会遇到一个问题,即 2 个写入器线程尝试同时插入,从而丢失数据:

  • 使用全局锁来插入计数器。
  • 通常,数据库有一个 updateOrInsert 样式的命令可以为您执行此操作。

对于#2,你有几个我能想到的选择:

  • 使用锁(细粒度到每个计数器,或者您的数据库系统允许原子更新)。
  • 准备好丢失一些数据。
  • 在阅读方面,您可以注意计数器值是什么(并可能将其写回数据库),永远不要重置计数器,而只是忽略数据 < 以前的值。
于 2013-01-10T06:34:17.587 回答