java - 如何让 java servlet 更高效地输出大量数据?

标签 java json servlets elasticsearch

我有一个 java servlet,可以从 JSON 对象中提取信息。 JSON 对象由索引数据( Elasticsearch )的搜索结果组成。如果结果很少,这种方法效果很好,但是当结果很多时,速度会显着减慢。如果结果数量超过 50,000 个,浏览器有时会崩溃。我该怎么做才能更有效地浏览大量结果,以免浏览器崩溃。

这是我的代码:

//Result Count
int i = 1;

for (SearchHit sh : response.getHits().hits()) {
    out.println("Result " + i + " <br>");

    out.println("&nbsp;&nbsp;&nbsp;&nbsp;" + sh.getSource().get("@message").toString() + " <br>");

    HashMap hm = (HashMap) sh.getSource().get("@fields");

    Iterator it = hm.entrySet().iterator();

    while (it.hasNext()) {

        Map.Entry pairs = (Map.Entry)it.next();
        out.println("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" + pairs.getKey() + " = " + pairs.getValue().toString().replace("[", "").replace("]", "") + " <br>");
    }
    i++;
    out.println(" <br>");
}

最佳答案

从你的问题中并不清楚真正的瓶颈在哪里:

  • 它可能是您的 JSP 能够从 JSON 对象提取数据的速率。

  • 它可能是 JSP 格式化数据并写入数据的速率。

  • 可能是网络传输速率。

  • 它可能是浏览器能够读取和呈现响应的速率。

解决方案取决于瓶颈的实际位置,因此您需要通过分析服务器端并监视浏览器中发生的情况来解决这个问题。解决方案可能涉及更改您生成的 HTML,使其更小或渲染速度更快,或者更改生成 HTML 的方式;例如简化 JSON。 (就您而言,后者可能不是一个选项,因为您是从外部服务获取 JSON。)

解决此问题的另一种方法是重构 UI,这样您就不会尝试在一个页面中发送 50,000 个结果。要么做一些服务器端工作来减少/提取结果,使用某种结果集分页,要么在用户浏览器中做一些聪明(且高效)的事情来动态呈现结果。 (最后一个选项涉及将结果作为 JSON 发送到浏览器,并且需要大量浏览器端编码来呈现数据、浏览器独立性问题等!)

期望用户费力浏览包含 50,000 个结果的页面的 Web UI(在我看来)几乎无法使用。

关于java - 如何让 java servlet 更高效地输出大量数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6852639/

相关文章:

JSON反序列化覆盖现有数据表结构

java - 如何将两个表的数据合二为一?

jsp - 如何在 index.jsp 上加载 servlet

java - 为什么我的 Zeller 同余程序在整个月内总是给出一周中的同一天?

java - 类型转换并获取数组以查看通用结果

java - solr 和 lucene 的区别

javascript - 如何从脚本标签中提取字符串数据,其中脚本没有任何 id?

java - 无法在recyclerview中使用exoplayer播放视频

javascript - 无法将长 json 保存到 Internet Explorer 11 中的文件

java - JSP 中的服务器端重定向和客户端重定向 - 哪个更好?