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

时间:2013-03-24 16:09:08

标签: java database caching synchronization key-value

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

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

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

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

3 个答案:

答案 0 :(得分:1)

1)NoSQL数据库似乎适合您的要求:仅通过密钥访问值。伯克利是一家有序的键值商店。你需要钥匙订购吗?如果没有,请检查其他解决方案:Mongo,couchbase。

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

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

答案 1 :(得分:1)

今天数据库中的数百万条记录或1GB数据量并不是很大。您可以使用“传统”DBRMS(PostgreSQL,MySQL,Oracle,...)或采用“热门”技术(H2,MongoDB,...)。 Oracle Berkeley可以将数据存储在内存中,因此读写速度非常快。制作索引。

答案 2 :(得分:0)

如果没有,请检查MongoDB。它不是事务性的,但它主要是内存驻留,如果不需要ACIDity的所有方面,它看起来可以简化您的堆栈。