2009-01-13 94 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(); 
}