处理Java EE应用程序中的大型记录

cra*_*man 2 java mysql jdbc large-data-volumes java-ee

有一个表phonenumbers有两列:idnumber.有大约half a million entries在表中.数据库是MySQL.

要求是开发一个连接到该数据库的简单Java EE应用程序,允许用户通过遵循特定URL 下载所有numbercomma separated style.

如果我们得到一个巨大的所有值,String array然后在a中连接它们(在所有值之间使用逗号)String然后将其发送给用户,它听起来是一个合适的解决方案吗?

该申请不公开,将由有限的号码使用.人

Bal*_*usC 8

您最好的选择是以任何方式将数据存储在Java的内存中,而是在数据进入时立即将获取的数据写入响应.您还需要配置MySQL JDBC驱动程序以逐行提供结果集通过Statement#setFetchSize()为每MySQL JDBC驱动程序文件,否则将缓存整个事情的记忆.

假设您熟悉Servlets,这里有一个启动示例,将所有这些都考虑在内:

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) {}
    }
}
Run Code Online (Sandbox Code Playgroud)