2017-06-02 61 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