我需要一些想法来实现Java中的(真的)高性能内存数据库/存储机制。在存储20,000个Java对象的范围内,每5秒钟更新一次。
有些选项我打开:Java中最高性能的数据库
纯JDBC /数据库组合
JDO
JPA/ORM /数据库组合
对象数据库
其他存储机制
我最好的选择是什么?你有什么经验?
编辑:我还需要希望能够查询这些对象
我需要一些想法来实现Java中的(真的)高性能内存数据库/存储机制。在存储20,000个Java对象的范围内,每5秒钟更新一次。
有些选项我打开:Java中最高性能的数据库
纯JDBC /数据库组合
JDO
JPA/ORM /数据库组合
对象数据库
其他存储机制
我最好的选择是什么?你有什么经验?
编辑:我还需要希望能够查询这些对象
你可以试试类似Prevayler(基本上是一个内存缓存,为你处理序列化和备份,因此数据持久并且事务安全)。还有其他类似的项目。 我已经将它用于大型项目,它非常安全并且速度非常快。
如果它是20,000个对象的同一组,或者每5秒钟至少没有20,000个新对象但有很多更改,那么缓存更改并定期以批处理模式写入更改可能会更好(jdbc批量更新很多快于单个行更新)。取决于您是否需要每次写入都是事务封装的,以及是否需要更改日志的记录或仅汇总更改。
编辑:其他帖子提到Prevayler我想我会留下一张纸条上它做什么: 基本上,你创建一个搜索/序列化对象(通常是地图某种),它被包裹在一个Prevayler实例,它被序列化到磁盘。您可以通过向您的Prevayler实例发送您的更改的可串行化记录(仅包含更改说明的对象)来进行更改,而不是直接对您的地图进行更改。 Prevayler的事务版本是将序列化更改写入磁盘,以便在发生故障时可以加载上次完整备份,然后根据该备份重播更改。尽管你必须有足够的内存来加载所有的数据,并且它是一个相当旧的API,但是很不幸,所以没有通用接口。但绝对稳定,如广告所示。
尝试以下,这与Hibernate执行得很好,如果你想存储所有其他的ORM框架
你的数据在内存中,你可能想看看Prevayler。
我从来没有用过它,但它似乎是一个比使用关系数据库更好的解决方案,可以将所有数据存储在内存中。
HSQLDB是相当快的,但它不是ACID事务安全。我知道的最快的java数据库是db4o:benchmarks。
编辑:请注意,Prevayler不是数据库,请参阅http://www.prevayler.org/wiki.jsp?topic=PrevaylerIsNotADatabase。如果你的内存不足,你运气不好。
Berkeley DB for Java是一个快速内存数据库,对于简单对象图非常有用。
秦始皇也可能是为你找出答案。它允许多个虚拟机共享对象,因此您可以分配负载等...
我强烈建议H2。这是一位原创作者完成的一种“第二代”HSQLDB版本。 H2允许我们单元测试我们的DAO层,而不需要实际的PostgreSQL数据库,它是真棒。
有一个活跃的网络组和邮件列表,作者托马斯·穆勒是非常敏感的查询(哈,小双关在那里。)
您可以尝试CSQL(下开源和企业版中提供)它提供比基于磁盘的数据库系统高30倍的性能并提供JDBC接口。它可以配置为独立的主内存数据库,或者作为MySQL,Postgres,Oracle数据库的透明缓存。
您还可以检查出db4o
H2是真正梦幻般的,的确,在内存中,正常的服务器和交易,你拥有这一切。然而,它并没有将性能与对象数据库进行比较,我看到Db4o提到,事实上我已经在Neodatis上获得了更好的性能,并且在Maven存储库中设置的都很好。尽管不像法拉利那么强劲,但速度很快,但不像甲骨文这样的卡车。
我会给一个尝试OrientDB。
这是一个老问题,但现在有很多数据库的性能等级为20,000/s。选择哪个数据库取决于您想要制作的查询的数据结构和类型。它也取决于整体数量。
我们有大量的时间序列数据,约300,000 rec/s和类似的问题,我们最终编写了一个新的数据库NFSdb,具有足够简单的API和体面的表现。它可以做大约2,000,000个对象写入/秒,而我们没有ORM就离开了。存储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();
}
Chronicle Map是一个可嵌入的纯Java持久性数据库,提供了一个简单java.util.Map
接口。它可以承受大约100万个来自单线程的每秒查询/更新每秒,读写性能一致,并且几乎线性地与机器内核的数量成比例。
下面是一些近期表现研究与实际数字:
对Prevayler很感兴趣...知道任何好的教程? – systemoutprintln 2009-01-13 18:36:40
网站上的文档不是非常广泛,但图书馆下载包含演示。使用非常简单。 – 2009-01-13 22:40:51
史蒂夫,你可以看看我的关于Prevayler的问题吗? http://stackoverflow.com/questions/454294/what-are-synchronizing-strategies-for-prevayler – Sergey 2009-01-17 23:30:43