让我先简单介绍一下情况。数据库是Sybase。有大约2-3 k的存储过程.存储过程可能会返回大量数据(大约百万条记录)。将有一个服务(servlet / spring控制器),它将调用所需的过程并以xml格式将数据刷新回客户端。
我需要应用过滤(对多列和多个条件)/排序(基于一些动态标准),我已经这样做了。
问题是,由于数据量很大,在内存中进行所有的筛选/排序都不是很好。我想到了下面的选择。
选项1:获得ResultSet对象后,读取X。记录,过滤它,存储在某个文件中,重复这个过程直到所有的数据被读取。然后读取文件并将数据刷新到客户端。
我需要弄清楚如何对文件中的数据进行排序,以及如何将对象存储在文件中,以便快速地进行筛选/排序。
选项2:查找一些Java,它接受数据,根据给定的条件对其进行筛选和排序,并将其作为流返回
选项3:使用内存中的数据库,如hsqldb、h2database,但我认为这将增加开销而不是帮助。我需要先插入数据,然后查询数据,然后再使用文件系统。
注意,我不想修改存储过程,因此在数据库中进行筛选/排序的选项不是一个选项,如果没有其他选项,则可能是最后一个选项。
此外,如果有用的话,我从ResultSet读取的每条记录都存储在Map中,其中键是列名,此Map存储在列表中,在列表上应用筛选和排序。
您认为哪个选项对内存占用、可伸缩性、性能方面或对此场景有好处的任何其他选项都有好处?
谢谢
发布于 2012-12-20 12:30:19
我建议您的选项3,但它不需要是内存中的数据库;您可以使用适当的数据库。任何其他选择都只是对海量数据排序这一一般问题的一个更具体的解决方案。毕竟,这正是数据库的作用所在,而且它做得非常好。
如果您真的认为您的选项3不是一个好的解决方案,那么您可以实现一个排序/合并解决方案。像您已经做的那样收集您的Map,但是每当您达到记录的限制(比如10,000条),将它们写入磁盘并从内存中清除它们。
一旦您的数据完成,您现在可以打开您编写的所有文件,并对它们执行合并。
发布于 2012-12-20 11:45:11
hadoop适用于您的问题吗?
您应该过滤数据库本身中的数据。您可以编写聚合过程,它将执行所有其他过程、合并数据或过滤它们,但是最好的选择是修改2-3千个存储过程,以便它们只返回所需的数据。
https://stackoverflow.com/questions/13971408
复制相似问题