2010-03-25 73 views
9

TLDR:使用內存數據庫vs鎖和併發數據結構的優點/缺點是什麼?關於內存數據庫與線程安全數據結構的建議

我目前正在研究一個具有許多(可能是遠程)顯示的應用程序,這些顯示從多個數據源收集實時數據並在屏幕上實時呈現它們。其他開發人員之一建議使用內存數據庫,而不是使用其他系統的標準方式,即使用併發hashmaps,隊列,數組和其他對象來存儲圖形對象並安全地處理它們必要時鎖定。他的觀點是,數據庫將減少需要擔心併發性,因爲它會自動處理讀/寫鎖,並且數據庫將提供更簡單的方法將數據構造成我們需要的許多表,而不是創建具有列表等等,並保持一切。

我自己沒有太多的數據庫經驗,所以我問問同胞SO用戶他們有什麼經驗,以及將數據庫插入系統的優點是什麼&?

+0

增加了一個賞金來徵求更多的答案 – 2010-03-28 16:52:54

+0

這就是STM庫的目的!他們爲你管理鎖定。 – 2010-07-31 23:47:23

回答

5

那麼主要的con會是Java和數據庫之間的不匹配。如果你不需要它,那將是一件非常頭疼的事情。對於非常簡單的訪問,它也會慢很多。另一方面,在崩潰的情況下,好處將是文件系統的事務和持久性。另外,根據您的需要,它允許以一種常規的Java數據結構難以處理的方式進行查詢。

對於之間的事情,我會看看Neo4j。它是一個純粹的Java圖形數據庫。這意味着它很容易嵌入,處理併發和事務處理,擴展性好,並且不存在關係數據庫所具有的所有不匹配問題。

更新如果你的數據結構是很簡單 - 地圖列表,地圖的地圖,類似的東西,你也許可以逃脫無論是在JDK或Google Collections併發集合,但遠遠超出這一點,您可能會發現自己正在重新創建內存數據庫。如果你的查詢限制甚至是非常困難的,你將不得不自己實現所有這些設施。然後你必須確保它們同時工作等等。如果這需要任何嚴重的複雜性或規模(大數據集),我絕對不會推出自己的產品,除非你真的想承諾它。

如果你確實決定使用嵌入式數據庫,那麼有很多選擇。您可能想從考慮是否想要使用SQL或NoSQL路線開始。除非你看到SQL的真正好處,否則我認爲這也會大大增加你的應用程序的複雜性。 Hibernate可能是最簡單的路線,實際SQL最少,但它仍然是一個令人頭疼的問題。我已經完成了Derby沒有嚴重問題,但它仍然不直接。您可以嘗試db4o這是一個可以嵌入並且不需要映射的對象數據庫。 This is a good overview.就像我以前說過的那樣,如果是我,如果我可能會嘗試Neo4j,但那可能只是我想玩新的閃亮的東西;)我認爲它是一個非常透明的圖書館,是有道理的。 Hibernate/SQL和db4o似乎有太多的感覺輕量級的揮手。

+2

關於對文件系統持久性的額外容易性的好處 – 2010-03-25 18:09:36

+1

通過使數據模型更加透明,數據庫方向也取得了巨大的成功。對涉及複雜數據結構的代碼進行更改可能非常複雜。然而,當數據被組織爲表格和關係時,情況會更加明顯。而對於現代的ORM,我不認爲現在的數據庫訪問是最令人頭痛的事情。當然,與手寫複雜數據結構併發性相比,頭疼得多。我會選擇數據庫路由。 – nicerobot 2010-03-25 18:13:19

+0

neo4j看起來非常有前途,現在我已經在他們的wiki上讀了一些關於它的內容。 – 2010-03-30 17:24:13

-1

我不清楚爲什麼你覺得內存數據庫不能線程安全。

你爲什麼不看JDO和DataNucleus?他們有很多不同的數據存儲區,您可以在其中插入後端持久性提供程序在運行時的配置步驟。您的應用程序代碼依賴於ORM,但該ORM可能插入到RDBMS,DB40,NeoDatis,LDAP等中。如果一個後端不適合您,請切換到另一個後端。

+0

你誤解了我的問題。我沒有說數據庫不是線程安全的,事實上這是爲什麼要使用數據庫的考慮因素之一。 – 2010-03-29 13:35:19

1

我曾經工作已經使用Oracle TimesTen的一個項目。這是早在2006年初,當Java 5剛剛發佈和java.util.concurrent類幾乎不知道。我們開發的系統具有相當大的可擴展性和吞吐量要求(這是SMS/MMS消息的核心電信設備之一)。

簡言之,推理的TimesTen是公平的:「讓我們的外包併發性/可擴展性問題,別人並專注於我們的業務領域」,並感覺良好即可。但是這在2006年又回來了。我不認爲今天會做出這樣的決定。

併發是很難的,但如此處理是內存中的數據庫。解放併發性問題你必須成爲內存數據庫領域的專家。微調TimesTen進行復制是很困難的(我們必須聘請Oracle的專業顧問來完成這項工作)。許可證不是免費的。您還需要擔心其他圖層不是開源的,並且/或者可能使用與您理解的語言不同的語言編寫。

但是,如果不知道自己的經驗,預算和時間要求等因素,很難作出任何判斷。周圍購物,花點時間研究像樣的併發框架(如http://akkasource.org/)......並讓我們知道你已經決定的東西;)

4

您可以使用類似Space4J,並獲得和內存數據庫的好處既是收藏品一樣的界面了。在實際使用中,像Collection 這樣基本的東西是,它是一個沒有索引的內存數據庫。列表一個內存數據庫中有一個int索引。一個映射在內存數據庫中的一個索引類型基於T索引和沒有併發性,除非同步或java.util.concurrency。*實現。

+2

space4j的索引模式非常強大,有4種類型的索引。看看:http://forum.space4j.org/posts/list/5.page – TraderJoeChicago 2011-09-13 02:02:42

1

以下是這可能有助於決定一些問題。

  • 查詢 - 您是否需要以不同形式查詢/重新投射/彙總您的數據?
  • 交易 - 您是否曾經需要回滾添加的數據?
  • 持久性 - 你只需要出示收集的數據,或者你還需要將其存儲在某種方式?
  • 可擴展性 - 您的數據是否總是適合內存?
  • 性能 - 它應該多快?