我有一个telco计费软件系统.其中有日常的用户电话记录.日志按日期(月)水平划分.每个分区存储在单独的数据库中,并且可以分散在多个实例上.
在UI中,用户将指定日期范围.返回的数据可以在任何字段上排序.日期范围可以跨越多个分区.应用程序必须支持通过日期范围的数据进行分页.
我无法将太多记录加载到内存中进行排序.在查询中放置排序只能在一个结果集中提供排序数据.
所以我需要对来自多个分区进行排序的数据进行排序.如何从多个排序的结果集返回排序记录到UI?
编辑:经过对这个问题的更多分析,我们有更多的投入.还有分页的要求.因此,我们需要找到一种方法来对多个结果集进行实时排序.
解决方法
通过依赖ResultSet加载内存中有限数据的能力,我们可以使用Dynamic Comparator提供
Java中的解决方案.解决方案是从每个resultSet中获取第一条记录,并在java中排序,并从排序数据中返回第一个元素.
详细解决方案:
首先,我们构建了一个程序,可以根据屏幕上选择的标准给我们一个二维比较器.
第二,我们在DAO上编写了一个AggregateResultSet包装器,该包在不同分区的ResultSet中包装.注意:这些单独的ResultSet已经按照相同的标准排序.然后,AggregateResultSet将被赋予动态比较器.
此AggregateResultSet将具有一个数据结构,以便初始化每个结果集的第一个元素.它将返回next()的调用下一个元素.该元素将是根据dynamicComparator首先创建的元素.在next()调用期间,我们从临时数据结构中删除该元素,并从临时数据结构中的相同结果集中插入下一个元素.这样,AggregateResultSet将以预期顺序返回数据,通过在Java中合并/存储/排序非常有限的数据.
我们希望不会收到比较问题,因为我们在排序中大部分是数字/字符串数据.