Java中最高性能的数据库

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

纯JDBC /数据库组合

JDO

JPA / ORM /数据库组合

对象数据库

其他存储机制

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

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

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

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

编辑 :正如其他post提到Prevayler我以为我会留下一个关于它的作用的说明:基本上你创建一个可搜索/可序列化的对象(通常是某种类型的Map),它包含在Prevayler实例中,该实例被序列化为磁盘。 您可以通过向Prevayler实例发送更改的可序列化记录(仅包含更改指令的对象)来进行更改,而不是直接对地图进行更改。 Prevayler的事务版本是将序列化更改写入磁盘,以便在发生故障时可以加载最后一个完整备份,然后重放更改。 它是安全的,虽然你必须有足够的内存来加载你的所有数据,而且它是一个相当古老的API,所以不幸的是没有通用的接口。 但绝对稳定,并按广告宣传。

我强烈推荐H2 。 这是一个由原作者之一完成的HSQLDB的“第二代”版本。 H2允许我们对DAO层进行unit testing,而不需要实际的PostgreSQL数据库,这非常棒

有一个活跃的网络组和邮件列表,作者托马斯·穆勒对查询非常敏感(哈哈,那里的小双关语。)

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

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

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

我们遇到了大量时间序列数据的类似问题,大约300,000 rec / s,我们最终编写了一个新的数据库NFSdb ,具有足够简单的API和良好的性能。 它可以做大约2,000,000个对象写入/ s,我们没有使用ORM就离开了。 存储API看起来像:

JournalFactory factory = new JournalFactory("/mnt1/data/tick"); MyObject o = new MyObject(); try (JournalWriter writer = factory.writer(MyObject.class)) { o.setBlah(...); writer.append(o); // more appends here // writer.commit(); } 

尝试以下方法,它在Hibernate和其他ORM框架上表现得非常好

http://hsqldb.org/

我会尝试一下OrientDB 。

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

以下是一些最近的实际数字表现研究:

  • Jetbrains Xodus,Oracle Berkeley DB JE BTree,MapDB TreeMap,Chronicle Map和H2 MVStore Map的比较
  • LmdbJava基准测试

兵马俑也可能是你的答案。 它允许多个VM共享对象,因此您可以分配负载等…

您还可以查看db4o

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

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

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

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

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

H2真的很棒,事实上,在内存,普通服务器和事务中,你拥有一切。 然而,它没有在性能上与对象数据库进行比较,我看到Db4o提到,事实上我对Neodatis有更好的表现,并且在Maven存储库中设置得很好。 虽然不像法拉利那样强劲,但速度快但不像甲骨文这样的卡车。

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