我需要在Java中实现(真正)高性能内存数据库/存储机制的想法。在存储20,000多个java对象的范围内,每5秒左右更新一次 我愿意接受的一些选择:
纯JDBC /数据库组合
JDO
JPA / ORM /数据库组合
对象数据库
其他存储机制
我最好的选择是什么?你有什么经历?
编辑:我还需要能够查询这些对象
答案 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)
答案 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框架中表现非常好
答案 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)
答案 13 :(得分:0)
您可以尝试CSQL(在开源和企业版下可用)它比基于磁盘的数据库系统提供30倍的性能提升并提供JDBC接口。它可以配置为独立的主内存数据库或MySQL,Postgres,Oracle数据库的透明缓存。