java - 高性能小数据本地数据存储

标签 java

所以,这就是我的场景。

我有数百万个事件进来,我不想将这些数据直接扔到我的数据库中。我想要一个“批处理”操作,其中 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/

相关文章:

java - 递归调用如何工作

java - MultiDex NoClassDefFounderror

java - 使用 FTPClient 从 "some"服务器下载的图像已损坏

java - java中从子框架返回数据到父框架

java - 为什么当有一个尚未完成的完成阶段时主线程不终止?

java - 在 Java 中安全地将 long 转换为 int

java - 替代 CopyOnWriteArrayList 用于频繁写入,偶尔迭代

java - 在 Linux 上部署到 Tomcat 时出现 JSF PropertyNotFound

java - 在矩阵中实现线程数组

java - Joda 部分日期的边界日期