我需要一些想法来用 Java 实现(真正的)高性能内存数据库/存储机制。在存储 20,000 多个 java 对象的范围内,每 5 秒左右更新一次。
我愿意接受的一些选择:
纯JDBC/数据库组合
JDO
JPA/ORM/数据库组合
对象数据库
其他存储机制
我最好的选择是什么?你有什么经验?
编辑:我还需要能够查询这些对象
我需要一些想法来用 Java 实现(真正的)高性能内存数据库/存储机制。在存储 20,000 多个 java 对象的范围内,每 5 秒左右更新一次。
我愿意接受的一些选择:
纯JDBC/数据库组合
JDO
JPA/ORM/数据库组合
对象数据库
其他存储机制
我最好的选择是什么?你有什么经验?
编辑:我还需要能够查询这些对象
您可以尝试像Prevayler 之类的东西(基本上是一个内存缓存,可以为您处理序列化和备份,以便数据持久存在并且在事务上是安全的)。还有其他类似的项目。我已经将它用于一个大型项目,它安全且速度极快。
如果它是同一组 20,000 个对象,或者至少不是每 5 秒有 20,000 个新对象但有很多更改,那么最好缓存更改并定期以批处理模式写入更改(jdbc 批量更新比单个行快得多更新)。取决于您是否需要对每个写入进行事务性包装,以及您是否需要更改日志的记录或只是汇总更改。
编辑:正如其他帖子提到的 Prevayler 我想我会留下一个关于它的作用的注释:基本上你创建一个可搜索/可序列化的对象(通常是某种 Map ),它被包装在一个 Prevayler 实例中,该实例被序列化到磁盘. 您可以通过向 Prevayler 实例发送您的更改的可序列化记录(只是一个包含更改指令的对象)来进行更改,而不是直接对您的地图进行更改。Prevayler 的事务版本是将您的序列化更改写入磁盘,以便在发生故障时它可以加载最后一个完整备份,然后针对该备份重放更改。它是安全的,尽管您必须有足够的内存来加载所有数据,而且它是一个相当古老的 API,因此遗憾的是没有通用接口。
我强烈推荐H2。这是由原作者之一完成的一种“第二代”HSQLDB 版本。 H2允许我们在不需要实际的 PostgreSQL 数据库的情况下对 DAO 层进行单元测试,这很棒。
有一个活跃的网络组和邮件列表,作者 Thomas Mueller 对查询非常敏感(哈哈,那里有点双关语。)
这是一个老问题,但现在有很多数据库的性能水平为 20,000/s。选择哪个数据库取决于您想要进行的查询的数据结构和类型。它还取决于总体积。
我们在处理大量时间序列数据时遇到了类似的问题,大约 300,000 条记录/秒,我们最终编写了一个新数据库,它具有足够简单的 API 和良好的性能。它可以每秒执行大约 2,000,000 次对象写入,而我们在没有 ORM 的情况下就取消了。
它后来演变成QuestDB。
试试下面的,它在 Hibernate 和其他 ORM 框架中表现得非常好
Chronicle Map是一个可嵌入的纯 Java 持久化数据库,提供了一个简单的java.util.Map
接口。它可以承受来自单线程的每秒大约100 万次查询/更新,一致的读/写性能,并且几乎可以线性地扩展到机器中的内核数量。
以下是一些最近有实际数字的性能研究:
我会尝试OrientDB。
兵马俑也可能是您的答案。它允许多个虚拟机共享对象,以便您可以分配负载等......
您还可以查看db4o
如果您想将所有数据存储在内存中,您可能需要查看Prevayler。
我自己从未使用过它,但对于所有数据都可以存储在内存中的情况,它似乎是比使用关系数据库更好的解决方案。
hsqldb 相当快,但它不是 ACID 事务安全的。我知道的最快的 java 数据库是 db4o: benchmarks。
编辑:请注意 Prevayler 不是数据库,请参阅http://www.prevayler.org/wiki.jsp?topic=PrevaylerIsNotADatabase。如果你的 RAM 用完了,那你就不走运了。
Berkeley DB for Java是一个快速的内存数据库,对于简单的对象图非常有用。
H2 确实很棒,确实,在内存、普通服务器和事务方面,你拥有一切。但是它的性能无法与对象数据库进行比较,我看到提到了 Db4o,实际上我使用 Neodatis 的性能要好得多,并且一切都在 Maven 存储库中设置得很好。虽然不是很健壮,像法拉利,快但不像甲骨文的卡车。
你可以试试CSQL(开源和企业版)它提供了 30 倍的基于磁盘的数据库系统的性能提升,并提供了 JDBC 接口。它可以配置为独立的主内存数据库或作为 MySQL、Postgres、Oracle 数据库的透明缓存。