16

我需要一些想法来用 Java 实现(真正的)高性能内存数据库/存储机制。在存储 20,000 多个 java 对象的范围内,每 5 秒左右更新一次。
我愿意接受的一些选择:

纯JDBC/数据库组合

JDO

JPA/ORM/数据库组合

对象数据库

其他存储机制

我最好的选择是什么?你有什么经验?

编辑:我还需要能够查询这些对象

4

14 回答 14

12

您可以尝试像Prevayler 之类的东西(基本上是一个内存缓存,可以为您处理序列化和备份,以便数据持久存在并且在事务上是安全的)。还有其他类似的项目。我已经将它用于一个大型项目,它安全且速度极快。

如果它是同一组 20,000 个对象,或者至少不是每 5 秒有 20,000 个新对象但有很多更改,那么最好缓存更改并定期以批处理模式写入更改(jdbc 批量更新比单个行快得多更新)。取决于您是否需要对每个写入进行事务性包装,以及您是否需要更改日志的记录或只是汇总更改。

编辑:正如其他帖子提到的 Prevayler 我想我会留下一个关于它的作用的注释:基本上你创建一个可搜索/可序列化的对象(通常是某种 Map ),它被包装在一个 Prevayler 实例中,该实例被序列化到磁盘. 您可以通过向 Prevayler 实例发送您的更改的可序列化记录(只是一个包含更改指令的对象)来进行更改,而不是直接对您的地图进行更改。Prevayler 的事务版本是将您的序列化更改写入磁盘,以便在发生故障时它可以加载最后一个完整备份,然后针对该备份重放更改。它是安全的,尽管您必须有足够的内存来加载所有数据,而且它是一个相当古老的 API,因此遗憾的是没有通用接口。

于 2009-01-13T17:47:47.137 回答
9

我强烈推荐H2。这是由原作者之一完成的一种“第二代”HSQLDB 版本。 H2允许我们在不需要实际的 PostgreSQL 数据库的情况下对 DAO 层进行单元测试,这很棒

有一个活跃的网络组和邮件列表,作者 Thomas Mueller 对查询非常敏感(哈哈,那里有点双关语。)

于 2009-02-13T17:16:05.000 回答
7

我不知道它是否是最快的选择,但无论何时使用它,我都对H2非常满意。它是由最初编写 Hypersonic(后来成为 HSQLDB)的同一个人编写的。

据称速度非常快的另一个选择是Prevayler

于 2009-01-13T17:47:28.310 回答
7

这是一个老问题,但现在有很多数据库的性能水平为 20,000/s。选择哪个数据库取决于您想要进行的查询的数据结构和类型。它还取决于总体积。

我们在处理大量时间序列数据时遇到了类似的问题,大约 300,000 条记录/秒,我们最终编写了一个新数据库,它具有足够简单的 API 和良好的性能。它可以每秒执行大约 2,000,000 次对象写入,而我们在没有 ORM 的情况下就取消了。

它后来演变成QuestDB

于 2014-06-17T00:28:24.917 回答
4

试试下面的,它在 Hibernate 和其他 ORM 框架中表现得非常好

http://hsqldb.org/

于 2009-01-13T17:42:52.313 回答
4

Chronicle Map是一个可嵌入的纯 Java 持久化数据库,提供了一个简单的java.util.Map接口。它可以承受来自单线程的每秒大约100 万次查询/更新,一致的读/写性能,并且几乎可以线性地扩展到机器中的内核数量。

以下是一些最近有实际数字的性能研究:

于 2016-07-08T11:45:13.823 回答
3

我会尝试OrientDB

于 2012-03-07T16:26:00.533 回答
2

兵马俑也可能是您的答案。它允许多个虚拟机共享对象,以便您可以分配负载等......

于 2009-02-13T17:10:25.653 回答
2

您还可以查看db4o

于 2009-05-07T07:14:03.810 回答
1

如果您想将所有数据存储在内存中,您可能需要查看Prevayler

我自己从未使用过它,但对于所有数据都可以存储在内存中的情况,它似乎是比使用关系数据库更好的解决方案。

于 2009-01-13T17:47:03.207 回答
1

hsqldb 相当快,但它不是 ACID 事务安全的。我知道的最快的 java 数据库是 db4o: benchmarks

编辑:请注意 Prevayler 不是数据库,请参阅http://www.prevayler.org/wiki.jsp?topic=PrevaylerIsNotADatabase。如果你的 RAM 用完了,那你就不走运了。

于 2009-01-13T18:48:41.820 回答
1

Berkeley DB for Java是一个快速的内存数据库,对于简单的对象图非常有用。

于 2009-01-13T18:56:54.113 回答
1

H2 确实很棒,确实,在内存、普通服务器和事务方面,你拥有一切。但是它的性能无法与对象数据库进行比较,我看到提到了 Db4o,实际上我使用 Neodatis 的性能要好得多,并且一切都在 Maven 存储库中设置得很好。虽然不是很健壮,像法拉利,快但不像甲骨文的卡车。

于 2011-04-21T13:55:43.440 回答
0

你可以试试CSQL(开源和企业版)它提供了 30 倍的基于磁盘的数据库系统的性能提升,并提供了 JDBC 接口。它可以配置为独立的主内存数据库或作为 MySQL、Postgres、Oracle 数据库的透明缓存。

于 2009-05-07T06:57:18.467 回答