非序列化内存数据库

时间:2017-06-02 17:54:45

标签: java hsqldb

我有以下问题:

Set<C> sC个对象。 C定义如下:

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)。流过{{1}},过滤其他条件,收集,返回。

更多解决方案:为所有字段创建索引映射,从地图中选择所有条件,在最短列表上流式传输,过滤其他条件,收集,返回。

你知道这是怎么回事:我们不小心建立了一个数据库。问题是我不想序列化我的对象。当然我可以抓住H2或HSQLDB并将我的对象粘在那里,但我不想坚持它们。我基本上只想在常规的旧堆上Java对象上使用索引。

肯定有一些我可以重用的东西。

2 个答案:

答案 0 :(得分:0)

最终,我发现了一些解决此问题的项目,包括CQEngine,这似乎是用于此目的的最完整和最成熟的库。

答案 1 :(得分: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