2017-06-02 65 views
0

我有以下問題:非序列化的內存數據庫

C類對象的一個​​Set<C> sC定義如下:

class C { 
    A a; 
    B b; 
    ... 
} 

鑑於A eB f,...,我想從s找到的所有對象o這樣o.a = eo.b = f,....

簡單的解決方案:在流s,過濾,收集,返回。但這需要很長時間。

半分析解決方案:創建一個Map<A, Set<C>> indexA,它將集合拆分爲a的值。流過indexA.get(e),過濾其他條件,收集,返回。

更稱職的解決方案:創建索引地圖所有領域,選擇從地圖的所有條件,流過最短名單,對其他標準過濾器,收集的回報。

你會看到這是怎麼回事:我們無意中建立了一個數據庫。事情是,我不想序列化我的對象。當然,我可以抓住H2或HSQLDB,並堅持我的對象在那裏,但我不想堅持他們。我基本上只是想在我的常規舊的Java堆對象上使用索引。

當然,必須有一些我可以重複使用的東西。

+2

投票決定關閉,因爲*「一定有什麼東西在那裏,我可以重複使用」 *是[**的問題,要求我們建議還是找**的書,工具,**軟件庫* *,教程或其他非現場資源,因爲他們傾向於吸引自以爲是的答案和垃圾郵件,所以不適合堆棧溢出(https://stackoverflow.com/help/on-topic)。 – Andreas

+0

您是否因爲不想編寫代碼來維護「索引」映射而提問? – Andreas

+0

我想避免編寫該代碼。沒有泛型,代碼將會很無聊而且難以維護。對於泛型(不提前知道「C」),代碼會很有趣,但寫起來很耗時。又名圖書館。 – Tillerino

回答

0

最終,我發現了幾個解決這個問題的項目,其中包括CQEngine,它似乎是最完整和成熟的庫。

0

HSQLDB提供了將Java對象直接存儲在內存數據庫中而無需序列化的選項。

屬性sql.live_object=true用作連接到mem:數據庫的URL的屬性,例如jdbc:hsqldb:mem:test;sql.live_object=true。使用OTHER類的列創建表以存儲對象。此表中的額外列會複製需要建立索引的對象中的所有字段。

例如:

CREATE TABLE OBJECTLIST (ID INTEGER IDENTITY, OBJ OTHER, TS_FIELD TIMESTAMP, INT_FIELD INTEGER) 
CREATE INDEX IDX1 ON OBJECTLIST(TS_FIELD) 
CREATE INDEX IDX2 ON OBJECTLIST(INT_FIELD) 

的對象被存儲在OBJ列,並且被索引的字段的時間戳和整數值被存儲在額外的列。諸如SELECT * FROM OBJECTLIST WHERE INT_FILED = 1234之類的SQL查詢返回包含相關對象的行。

http://hsqldb.org/doc/2.0/guide/dbproperties-chapt.html#dpc_sql_conformance