我需要在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允许我们对DAO层进行单元测试,而不需要实际的PostgreSQL数据库,这非常棒.
有一个活跃的网络组和邮件列表,作者托马斯·穆勒对查询非常敏感(哈哈,那里的小双关语.)
我不知道它是否是最快的选择,但每当我使用H2时我都对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 (JournalWriterwriter = factory.writer(MyObject.class)) { o.setBlah(...); writer.append(o); // more appends here // writer.commit(); }