sql >> Base de Datos >  >> RDS >> Mysql

Manejo de grandes registros en una aplicación Java EE

Su mejor apuesta es no almacene los datos en la memoria de Java de cualquier manera, pero simplemente escriba los datos obtenidos en la respuesta inmediatamente a medida que ingresan los datos. También debe configurar el controlador MySQL JDBC para servir el conjunto de resultados fila por fila mediante Statement#setFetchSize() según la documentación del controlador MySQL JDBC , de lo contrario, almacenará todo en caché en la memoria.

Asumiendo que está familiarizado con los Servlets, aquí hay un ejemplo inicial que tiene todo eso en cuenta:

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) {}
    }
}