1

先简单介绍一下剧情。数据库是 Sybase。有一些 2-3 k 存储过程。存储过程可能会返回大量数据(大约百万条记录)。将有一个服务(servlet / spring 控制器)调用所需的过程并将数据以 xml 格式刷新回客户端。

我需要应用过滤(在多列和多个条件上)/排序(基于一些动态标准),我已经完成了。

问题是,由于数据量很大,在内存中进行所有过滤/排序并不好。我想到了以下选项。

选项 1: 一旦我得到 ResultSet 对象,请阅读一些 X 号。记录,过滤它,将其存储在某个文件中,重复此过程直到读取所有数据。然后只需读取文件并将数据刷新到客户端。

我需要弄清楚如何对文件中的数据进行排序以及如何将对象存储在文件中,以便快速过滤/排序。

选项 2: 查找一些 Java API,它获取数据、过滤数据并根据给定标准对其进行排序,然后将其作为流返回

选项 3: 使用内存数据库,如 hsqldb、h2database,但我认为这会产生开销而不是帮助。我需要先插入数据然后查询数据,这也将反过来使用文件系统。

注意我不想修改存储过程,所以在数据库中进行过滤/排序的选项不是一个选项,或者如果没有其他方法,可能是最后一个选项。

此外,如果有帮助,我从 ResultSet 读取的每条记录都将其存储在 Map 中,键是列名,此 Map 存储在 List 中,我在其上应用过滤和排序。

您认为哪个选项有利于内存占用、可扩展性、性能方面或任何其他适合此场景的选项?

谢谢

4

2 回答 2

2

我会推荐您的选项 3,但它不需要是内存数据库;您可以改用适当的数据库。任何其他选项都只是对分类大量数据的一般问题的更具体的解决方案。毕竟,这正是数据库的用途,而且它做得很好。

如果您真的认为您的选项 3 不是一个好的解决方案,那么您可以实施排序/合并解决方案。像你已经做的那样收集你Map的 s,但是当你达到记录的限制(比如 10,000 条)时,对它们进行排序,将它们写入磁盘并从内存中清除它们。

数据完成后,您现在可以打开您编写的所有文件并对其执行合并。

于 2012-12-20T12:30:19.230 回答
1

hadoop 适用于您的问题吗?

您应该过滤数据库本身的数据。您可以编写将执行所有其他过程、组合数据或过滤它们的聚合过程。但是最好的选择是修改 2-3 千个存储过程,以便它们只返回所需的数据。

于 2012-12-20T11:45:11.560 回答