如何对水平分区数据进行排序

Gau*_*wal 10 java sorting database-partitioning

我有一个电信计费软件系统.其中包含用户呼叫的每日日志.日志按日期(月)水平分区.每个分区都存储在一个单独的数据库中,可以分布在多个实例上.

在UI中,用户将指定日期范围.返回的数据可以在任何字段上排序.日期范围可能跨越多个分区.应用程序必须支持通过日期范围的数据进行分页.

我无法将太多记录加载到内存中进行排序.在查询中放置排序只能在一个结果集中提供排序数据.

所以我需要对多个分区中的数据进行排序,每个分区都是单独排序的 如何从多个排序结果集中将已排序记录返回到UI?

编辑:经过对此问题的更多分析,我们有更多的输入.也需要分页.因此,我们需要找到一种方法来对多个结果集进行实时排序.

Gau*_*wal 2

通过依靠 ResultSet 在内存中加载有限数据的能力,我们能够使用动态比较器在 Java 中提出解决方案。解决方案是从每个结果集中获取第一条记录,并在 java 中对其进行排序,然后从排序后的数据中返回第一个元素。

详细解决方案:

首先,我们构建了一个程序,它可以根据屏幕上选择的标准为我们提供动态比较器。

其次,我们在 DAO 上编写了一个 AggregateResultSet 包装器,它包装了来自不同分区的 ResultSet。注意:这些单独的结果集已经按照相同的标准进行排序。然后 AggregateResultSet 将被赋予一个动态比较器。

这个 AggregateResultSet 将有一个数据结构来存储每个结果集的第一个元素。它将在调用 next() 时返回下一个元素。根据dynamicComparator,该元素将是第一个出现的元素。在 next() 调用期间,我们从临时数据结构中删除该元素,并将同一结果集中的下一个元素插入临时数据结构中。这样,AggregateResultSet 将通过合并/存储/排序 Java 中非常有限的数据,按预期顺序返回数据。

我们希望不会收到比较问题,因为我们在排序时主要有数字/字符串数据。