2009-01-13 73 views
15

我需要一些想法来实现Java中的(真的)高性能内存数据库/存储机制。在存储20,000个Java对象的范围内,每5秒钟更新一次。
有些选项我打开:Java中最高性能的数据库

纯JDBC /数据库组合

JDO

JPA/ORM /数据库组合

对象数据库

其他存储机制

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

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

回答

12

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

如果它是20,000个对象的同一组,或者每5秒钟至少没有20,000个新对象但有很多更改,那么缓存更改并定期以批处理模式写入更改可能会更好(jdbc批量更新很多快于单个行更新)。取决于您是否需要每次写入都是事务封装的,以及是否需要更改日志的记录或仅汇总更改。

编辑:其他帖子提到Prevayler我想我会留下一张纸条上它做什么: 基本上,你创建一个搜索/序列化对象(通常是地图某种),它被包裹在一个Prevayler实例,它被序列化到磁盘。您可以通过向您的Prevayler实例发送您的更改的可串行化记录(仅包含更改说明的对象)来进行更改,而不是直接对您的地图进行更改。 Prevayler的事务版本是将序列化更改写入磁盘,以便在发生故障时可以加载上次完整备份,然后根据该备份重播更改。尽管你必须有足够的内存来加载所有的数据,并且它是一个相当旧的API,但是很不幸,所以没有通用接口。但绝对稳定,如广告所示。

+0

对Prevayler很感兴趣...知道任何好的教程? – systemoutprintln 2009-01-13 18:36:40

+0

网站上的文档不是非常广泛,但图书馆下载包含演示。使用非常简单。 – 2009-01-13 22:40:51

+0

史蒂夫,你可以看看我的关于Prevayler的问题吗? http://stackoverflow.com/questions/454294/what-are-synchronizing-strategies-for-prevayler – Sergey 2009-01-17 23:30:43

4

尝试以下,这与Hibernate执行得很好,如果你想存储所有其他的ORM框架

http://hsqldb.org/

1

你的数据在内存中,你可能想看看Prevayler

我从来没有用过它,但它似乎是一个比使用关系数据库更好的解决方案,可以将所有数据存储在内存中。

7

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

据称速度非常快的另一种选择是Prevayler

+0

prevayler不是数据库:http://www.prevayler.org/wiki.jsp? topic = PrevaylerIsNotADatabase – nes1983 2009-01-13 18:52:27

+1

取决于你对“数据库”的定义。它绝对不是一个关系数据库,但它似乎满足数据库的最低限度定义。 – 2009-01-13 19:04:09

+0

好吧,我想这是真的。我的意思是它只保存尽可能多的数据。 – nes1983 2009-01-15 20:15:11

2

秦始皇也可能是为你找出答案。它允许多个虚拟机共享对象,因此您可以分配负载等...

8

我强烈建议H2。这是一位原创作者完成的一种“第二代”HSQLDB版本。 H2允许我们单元测试我们的DAO层,而不需要实际的PostgreSQL数据库,它是真棒

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

0

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

1

H2是真正梦幻般的,的确,在内存中,正常的服务器和交易,你拥有这一切。然而,它并没有将性能与对象数据库进行比较,我看到Db4o提到,事实上我已经在Neodatis上获得了更好的性能,并且在Maven存储库中设置的都很好。尽管不像法拉利那么强劲,但速度很快,但不像甲骨文这样的卡车。

5

这是一个老问题,但现在有很多数据库的性能等级为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(); 
}