我正在开发一个 Java 应用程序,它处理大量(~ 1.000.000)的键值对。键的大小是固定的,而值的大小从 20 字节到 ~1 kbyte 不等。所以在最坏的情况下,我得到了大约 1 GB 的数据。
键值对由多个线程(约 3-5 个线程)同时读取和写入。在大多数情况下,读取和写入操作只影响单个键值对。
在键值对之上放置一个关系数据模型,用于选择所需的键。目前我将H2用于关系数据,但我不清楚使用哪种技术来存储键值对。
- 我应该使用哪个数据库来存储键值对?
- 伯克利数据库适合我的情况吗?
此外,更重要的是,我应该在哪个级别实现同步?
- 数据库层对我来说似乎很明智,但我应该如何处理应用程序中的连接管理?
- 我的第一个方法
- 为每个读/写操作使用一个连接池和一个单独的连接。
虽然这很容易实现,但在我看来,连接池的同步成为了瓶颈。
- 为每个读/写操作使用一个连接池和一个单独的连接。
- 我的第二个解决方案
- 对所有读取操作使用单个连接,对所有写入操作使用另一个连接,但我不确定该连接是否允许并发访问以及是否以可扩展的方式对它们进行序列化。
由于 JTables 定期查询键值对,因此访问时间很关键。我应该信任数据库的缓存系统还是在应用层实现/使用另一个缓存,例如 EHCache?
编辑:
该应用程序应该在较旧的 PC 上运行,因此我无法将整个数据放入内存中。
将键值对存储在现有的 H2 数据库中是可能的,但将它们放入专门用于键值对及其同步以获得更好性能的数据库不是更有意义吗?
我也不关心 ACID 属性。