java - 在 Java EE 应用程序中处理大型记录

标签 java mysql jdbc jakarta-ee large-data-volumes

phonenumbers 表有两列:idnumber。表中大约有 50 万个条目。数据库是 MySQL

要求是开发一个简单的 Java EE 应用程序,连接到该数据库,允许用户按照特定的 comma separated style 下载所有 number 值网址。

如果我们在一个巨大的 String 数组 中获取所有值,然后将它们连接到一个 String 中(所有值之间用逗号分隔),然后将其发送到用户,这听起来是一个合适的解决方案吗?

该应用程序不公开,将由有限的号码使用。的人。

最佳答案

最好的办法是以任何方式将数据存储在 Java 的内存中,而是在数据进入时立即将获得的数据写入响应。你还需要配置 MySQL JDBC 驱动程序以按 Statement#setFetchSize() 逐行提供结果集根据 MySQL JDBC driver documentation ,否则它会将整个内容缓存在内存中。

假设您熟悉 Servlet,下面是一个将所有这些都考虑在内的启动示例:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setContentType("text/plain");
    response.setHeader("Content-Disposition", "attachment;filename=numbers.txt"); // Force download popup.

    Connection connection = null;
    Statement statement = null;
    ResultSet resultSet = null;
    Writer writer = response.getWriter();

    try {
        connection = database.getConnection();
        statement = connection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
        statement.setFetchSize(Integer.MIN_VALUE);
        resultSet = statement.executeQuery("SELECT number FROM phonenumbers");

        while (resultSet.next()) {
            writer.write(resultSet.getString("number"));
            if (!resultSet.isLast()) {
                writer.write(",");
            }
        }
    } catch (SQLException e) {
        throw new ServletException("Query failed!", e);
    } finally { 
        if (resultSet != null) try { resultSet.close; } catch (SQLException logOrIgnore) {}
        if (statement != null) try { statement.close; } catch (SQLException logOrIgnore) {}
        if (connection != null) try { connection.close; } catch (SQLException logOrIgnore) {}
    }
}

关于java - 在 Java EE 应用程序中处理大型记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2180835/

相关文章:

java - 如何监视文件中的新内容并检索该内容

java shell命令对csv文件进行排序

java - postgresql 中的 IN 子句可以使用多少个参数?

java - 如何将 MS JDBC 驱动程序与 MS SQL Server 2008 Express 一起使用?

Spring 批处理 : Which ItemReader implementation to use for high volume & low latency

java - Android/Java - 如何将 HTML 代码附加到我的线性布局?

java - 访问 Android Spinner 中显示的任何子项的方法是什么,而不是仅仅等待 onItemSelected() 事件?

mysql - 从库上的行锁定是否也适用于主库?

MySQL 在一条语句中连接 3 个相关表

安装centos 7后mysql 8无法登录