所以,这就是我的场景。
我有数百万个事件进来,我不想将这些数据直接扔到我的数据库中。我想要一个“批处理”操作,其中 java 代码保存传入的事件,直到达到阈值(例如每 10 秒),然后它们向主数据库执行批量插入。
我还需要容错能力,因为如果机器崩溃,我不想丢失数据。 我正在考虑使用 hsqldb 将这些事件(大约 10k)保存 10 秒。
有什么建议吗?
最佳答案
如果您想要每秒数百万个完整数据并且持久性,您可以尝试。 Java Chronicle 您可以使用不同的进程来使用数据,因此如果您的程序终止,数据仍将写入数据库。 (此外,您的主进程不会因必须执行数据库更新而减慢)它还支持通过 TCP 复制到多台计算机。
基于此测试的简单示例 HERE
// create a Chronicle for reading or writing.
String basePath = TMP + File.separator + "deleteme.ict";
IndexedChronicle tsc = new IndexedChronicle(basePath);
// create a handle to excerpts in the chronicle.
Excerpt excerpt = tsc.createExcerpt();
// add 1024 entries.
int counter = 1;
for (int i = 0; i < 1024; i++) {
excerpt.startExcerpt(129);
for (int j = 0; j < 128; j += 8)
excerpt.writeLong(counter++);
excerpt.write(-1);
excerpt.finish();
}
// somewhere else read the file
int counter2 = 1;
Excerpt excerpt2 = tsc.createExcerpt();
while (excerpt2.nextIndex()) {
for (int j = 0; j < 128; j += 8) {
long actual = excerpt2.readLong();
long expected = counter2++;
if (expected != actual)
assertEquals(expected, actual);
}
assertEquals(-1, excerpt2.readByte());
excerpt2.finish();
}
assertEquals(counter, counter2);
这允许您在可用时进行批处理,以最大程度地降低未将其添加到数据库的风险。当 nextIndex() 返回 false 时,您将提交该批处理的事务,稍等片刻并重复。
关于java - 高性能小数据本地数据存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14222839/