Java中性能最高的数据库

时间:2009-01-13 17:34:47

标签: java database performance embedded-database

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

纯JDBC /数据库组合

JDO

JPA / ORM /数据库组合

对象数据库

其他存储机制

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

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

14 个答案:

答案 0 :(得分:12)

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

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

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

答案 1 :(得分:8)

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

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

答案 2 :(得分:7)

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

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

答案 3 :(得分:5)

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

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

JournalFactory factory = new JournalFactory("/mnt1/data/tick");

MyObject o = new MyObject();
try (JournalWriter<MyObject> writer = factory.writer(MyObject.class)) {

   o.setBlah(...);
   writer.append(o);

   // more appends here
   //
   writer.commit();
}

答案 4 :(得分:4)

尝试以下内容,它在Hibernate和其他ORM框架中表现非常好

http://hsqldb.org/

答案 5 :(得分:3)

我会尝试OrientDB

答案 6 :(得分:3)

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

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

答案 7 :(得分:2)

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

答案 8 :(得分:2)

您还可以查看db4o

答案 9 :(得分:1)

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

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

答案 10 :(得分:1)

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

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

答案 11 :(得分:1)

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

答案 12 :(得分:1)

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

答案 13 :(得分:0)

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