Java - 哪种数据库/技术用于大量频繁变化的键值对?

标签 java database caching synchronization key-value

<分区>

我正在开发一个处理大量(约 1.000.000)键值对的 Java 应用程序。键的大小固定,而值的大小从 20 字节到 ~1 KB 不等。所以在最坏的情况下,我得到了大约 1 GB 的数据。
键值对由多个线程(~ 3-5 个线程)同时读取和写入。在大多数情况下,读取和写入操作只影响单个键值对。
在键值对之上放置了一个关系数据模型,用于选择所需的键。目前我正在使用 H2对于关系数据,但我不清楚使用哪种技术来存储键值对。

  1. 我应该使用哪个数据库来存储键值对?
  2. 此外,更重要的是,我应该在哪个级别上实现同步?

    • 数据库层对我来说似乎很明智,但我应该如何处理应用程序中的连接管理?
    • 我的第一个方法
      • 为每个读/写操作使用一个连接池和一个单独的连接。
        虽然这很容易实现,但在我看来,连接池的同步成为瓶颈。
    • 我的第二个解决方案
      • 对所有读取操作使用一个连接,对所有写入操作使用另一个连接,但我不确定该连接是否允许并发访问以及它是否以可扩展的方式对它们进行序列化。
  3. 由于 JTables 定期查询键值对,因此访问时间很关键。我应该信任数据库的缓存系统还是在应用程序层上实现/使用另一个缓存,例如EHCache?

编辑:
该应用程序应在较旧的 PC 上运行,因此我无法将整个数据放入内存。
将键值对存储在现有的 H2 数据库中是可能的,但为了更好的性能,将它们放入专门用于键值对及其同步的数据库中不是更有意义吗?
我也不关心 ACID 属性。

最佳答案

1) NoSQL 数据库似乎适合您的要求:仅通过键访问值。 Berkeley 是一个有序的键值存储。您需要订购 key 吗?如果没有,请检查其他解决方案:Mongo、couchbase。

2) 在数据库级别同步将是最明智的选择。所以我会选择你的第一种方法。您的第二种方法肯定会引起争用,并且对开发人员来说更难管理。

3) 必要时缓存。您有经常访问的记录吗? EHCache 很好,你也可以使用其他系统,如 memcache。您需要根据您选择的数据库来决定缓存层。

关于Java - 哪种数据库/技术用于大量频繁变化的键值对?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15600780/

相关文章:

java - 中序查找二叉树中给定值的节点并返回

java - junit spring - @BeforeClass 在 @ContextConfiguration 之前运行

database - Access 2007 中数据的物理存储

php - 从两个mysql表中选择数据

ruby-on-rails - 如何使用 Rails 控制特定文件的 max-age?

java - 缓存 REST API (JAX-RS)

java - Springboot - Spring Kafka - 惰性容器工厂初始化

java - 如何使我的 Java 生成的 zip 文件与 WinZip 生成的相同

java - 如何编写 hql 查询以从逗号分隔的单词中搜索一个单词

javascript - 动态触发 HTML5 缓存 list 文件?