2010-09-13 72 views
3

我有以下要求:Java的嵌入式數據庫,它不需要JDBC

  1. 在磁盤上保持用戶的列表,以備將來裝載。每個用戶可能有3或4個屬性。通常有幾十到幾百個用戶,必須支持成千上萬的用戶(不需要支持10,000以上)。
  2. 保留磁盤上的記錄列表以供將來加載。每個記錄可能有十幾個屬性。通常會有0到10條記錄,但是必須支持進入低千位的記錄數(以處理記錄由於例如網絡關閉而未被處理一段時間的情況)。

用戶通常被寫成批處理,然後定期搜索以找到具有給定屬性的用戶(例如,通過提供的密碼來認證用戶)。

記錄間歇地寫入並間歇性地讀取(後者由週期性任務處理並在刪除記錄之前傳輸它們)。

我面臨以下侷限:

  1. 這是僅支持的Java 1.1.8/1.2.x的的一個子集的嵌入式設備。附帶的軟件包如下:
    • 的java.lang
    • java.io
    • java.util中
    • java.net
    • 的java.lang.reflect
    • java.util.zip
    • java.math
    • java.text
    • java.security
  2. 設備具有相當適中的資源(例如, 〜20 MB RAM取決於設備),如果可行,最好將它們存儲在磁盤上而不是內存中。
  3. 我們對設備的訪問權限有限,因爲我們的應用程序被放置在其自己的沙箱中,從而使安裝的數據庫變得不可行。我們的沙箱中有磁盤訪問。
  4. 只有一個應用程序需要訪問這些信息,並且可以同步訪問,這意味着線程安全/併發訪問不一定是需求。

我們有一個類似於我正在開發,但對於其使用專有文本格式的用戶名(例如哈希分隔)和記錄一個ObjectOutputStream不同設備的應用。

我看到當前實現的缺點:

  • 整個文件進行讀或寫爲一個整體,這意味着這兩個文件必須被頻繁讀取或數據在內存中的副本必須保存並且只有當它改變時才寫回磁盤。當與當前的應用程序一起使用後者時,它意味着內存使用量可以根據數據的大小無限增長。
  • 這兩種當前格式都是專有的,前者容易出現不良數據(當用戶名中含有散列時會發生什麼?),而後者不是人類可讀的(或可由常用工具查詢)。

這似乎是一種簡單的基於文件的嵌入式數據庫將是理想的情況,例如, derbysqlite。但是從我迄今爲止的研究看來,大多數選項都涉及JDBC驅動程序,而我沒有這些驅動程序(java.sql。*沒有在此設備上實現)。

是否有人知道一個現有的項目,這將是一個很好的契合?

回答

2

你可能會看看JDBM這是一個非常簡單的純Java鍵值存儲。如果您需要查找其他屬性,則可能需要爲反向索引創建一些附加表。

它比較舊,所以很可能會支持pre-java2平臺。

+0

這看起來很有前途 - 謝謝。我接受它,直到我找到一個它不會工作的原因或更好的事物。 – 2010-09-13 23:40:14

+0

不幸的是,每當我在設備環境中使用(get | set)NamedObject方法(例如,在運行FruitBasket示例時),我都會得到一個NullPointerException異常。它可以在我的機器上的JDK上正常運行。我在源代碼中探索了一下,但沒有任何明顯的跳出來對我。我想我現在要放棄並保存所有內容。我選擇離開這個答案,因爲它是我發現的最接近我想要的東西。 – 2010-10-04 23:42:26

1

你試過db4o?這是一個嵌入式對象數據庫。它運行在java 1.1上,不需要jdbc。

+0

謝謝。我想我會從JDBM開始,因爲它是免費的(GPL不適合我們),但這看起來也合理。 – 2010-09-14 15:37:47