如何在Java中获取170万条记录?

时间:2012-04-30 05:13:20

标签: java mysql linux centos5

我正在使用MySQL数据库,其中一个表有170万条记录。通过Java中的Restlet框架,我想获取这些记录并将其返回给客户端。我使用的是Linux Centos,它是远程服务器。我创建了WAR文件并上传到服务器上。当我运行服务时,需要花费大量时间来回复。我等了40分钟但没有得到任何输出。    那么有人可以帮我解决这个问题吗?

3 个答案:

答案 0 :(得分:4)

这可能不会起作用:在内存中保留许多行数据可能会导致内存不足异常(你能看一下服务器上的日志,看看究竟发生了什么吗?)。

要做这样的事情,你要么放弃那个计划并做某种分页,要么你需要一个解决方案,让你将记录流式传输到客户端而不将它们保存在内存中。我不确定Restlet框架是否允许您这样做:您可能需要自己使用servlet来实现它。

答案 1 :(得分:0)

当我有非常多的行时,我使用了内存映射文件。例如我有一个数据库,我必须在大约一分钟内检索和处理11亿行。 (超过200 GB)

这是一种非常专业的方法,我怀疑有一种方法可以调整SQL数据库或使用NoSQL数据库来执行您想要的操作。虽然你可以在一分钟内检索170万,具体取决于你正在做什么(例如,如果你选择了这么多,那么它需要一些时间才会花费一些时间)

但是,如果确实没有其他选项,您可以编写自定义数据存储。

BTW:只生成摘要。不应该期望任何人阅读那么多行,当然不会在浏览器中显示它们。也许您可以做一些事情来制作报告或摘要,因此发送客户端的次数较少。

答案 2 :(得分:0)

我在我的应用中成功完成了这种工作。如果您的客户已准备好接受大响应,那么该方法没有任何问题。重点是您需要流式传输响应,这意味着您无法将整个响应构建为字符串。获取HTTP响应的输出流并逐个写入记录。在db-end上,您需要设置一个可滚动的结果集(在JDBC级别以及在Hibernate级别都很容易)。