我需要一些想法來實現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