3

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

4

3 回答 3

4

这可能行不通:在内存中保存这么多行数据可能会导致内存不足异常(您可以查看服务器上的日志并查看到底发生了什么吗?)。

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

于 2012-04-30T05:22:27.997 回答
0

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

这是一种非常专业的方法,我怀疑有一种方法可以调整您的 SQL 数据库或使用 NoSQL 数据库来做您想做的事情。我会认为你可以在一分钟内检索 170 万,具体取决于你在做什么(例如,如果你在几个 TB 中选择这么多,这需要一段时间)

但是,如果真的没有其他选择,您可以编写自定义数据存储。

顺便说一句:只产生一个摘要。不应该期望任何人阅读那么多行,当然不会在浏览器中显示它们。也许您可以做一些事情来生成报告或摘要,以便发送给客户的时间更少。

于 2012-04-30T07:15:01.030 回答
0

我已经在我的应用程序中成功地完成了这种工作。如果您的客户准备好接受大响应,那么这种方法就没有错。要点是您需要流式传输响应,这意味着您不能将整个响应构建为字符串。获取 HTTP 响应的输出流,并将记录一一写入其中。在 db 端,您需要设置一个可滚动的结果集(在 JDBC 级别和 Hibernate 级别很容易做到)。

于 2012-04-30T09:01:55.483 回答