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