在Java应用程序中查询内存中的一组对象的技术

Edd*_*ant 8 java database jpa in-memory-database

我们有一个系统通过调用另一个返回一组Java对象的系统上的接口来执行"粗略搜索".一旦我们收到搜索结果,我需要能够根据描述属性状态的某些标准进一步过滤生成的Java对象(例如,从初始对象返回所有对象,其中xy> z && ab == c).

每次用于过滤对象集的标准部分是用户可配置的,我的意思是用户将能够选择要匹配的值和范围,但是他们可以从中选择的属性将是固定集.

对于每次搜索,数据集可能包含<= 10,000个对象.搜索将由应用程序用户群手动执行,每天不超过2000次(大约).值得一提的是,结果集中的所有对象都是已知的域对象类,它们具有描述其结构和关系的Hibernate和JPA注释.

可能的解决方案

在我的头脑中,我可以想到3种方法:

  1. 对于每次搜索,在我们的数据库中保留初始结果集对象,然后使用Hibernate使用更细粒度的标准重新查询它们.
  2. 使用内存数据库(例如hsqldb?)来查询和优化初始结果集.
  3. 编写一些自定义代码,迭代初始结果集并提取所需的记录.

选项1

选项1似乎涉及很多网络中的物理数据库(Oracle 10g),可能会导致大量的网络和磁盘活动.还需要将每次搜索的结果与其他结果集隔离,以确保不同的搜索不会相互干扰.

选项2

选项2原则上似乎是一个好主意,因为它允许我在内存中进行更精细的查询,并且不需要结果数据的持久性,只有在搜索完成后才会丢弃.Gut的感觉是,这可能也非常高效,但可能会导致更大的内存开销(这很好,因为我们可以非常灵活地调整JVM获得的内存量).

选项3

选项3可能非常高效,但是我想避免这样做,因为我们编写的任何代码都需要经过仔细的测试,以至于实现灵活且足够强大的时间可能会令人望而却步.


我没有时间对所有3个想法进行原型设计,因此我正在寻找人们对上述3个选项的评论,以及我未考虑过的任何进一步的想法,以帮助我确定哪个想法可能是最合适的.我目前正倾向于选项2(在内存数据库中),所以很想听到有人在内存中查询POJO的经验.

希望我已经详细描述了这种情况,但是不要犹豫,询问是否需要任何进一步的信息来更好地理解这种情况.

干杯,

埃德

pdb*_*ett 0

精炼标准有多复杂?如果大多数都非常简单,我会很想从选项(3)开始,但要确保它封装在合适的接口后面,这样,如果您遇到过于复杂或效率低下而无法自己编写代码的东西,此时可以切换到内存数据库(如果设置临时表有开销,则可以批量切换到所有查询,或者仅切换到复杂的查询)。