1

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

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

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

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

4

3 回答 3

1

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

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

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

于 2013-03-24T16:22:30.487 回答
1

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

于 2013-03-24T16:28:26.130 回答
0

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

于 2013-03-24T16:20:01.103 回答