Java, excel millones de medidas de optimización de exportación de datos, transmisión de SXSSFWorkbook, ejemplo de exportación por lotes

Al exportar millones de datos, si no toma las medidas de optimización adecuadas, puede causar problemas como bloqueos y bloqueos de memoria.

Para evitar estos problemas, se pueden adoptar las siguientes medidas de optimización:

  1. Lea datos en lotes: divida los datos que se exportarán en varios lotes para leer y escribir, lea parte de los datos cada vez y borre la memoria inmediatamente después de escribir en Excel. Esto puede evitar el problema del uso excesivo de memoria causado por cargar todos los datos a la vez.
  2. Use el método de escritura de transmisión: mientras recorre el conjunto de resultados, use el método de escritura de transmisión (como SXSSF) para escribir los datos en la tabla de Excel, evitando escribir todos los datos en la memoria al mismo tiempo.
  3. Cierre las conexiones innecesarias: al escribir código, debe cerrar las conexiones ResultSet, Statement y Connection a tiempo para liberar recursos y reducir la carga del sistema.
  4. Utilice una configuración de hardware de servidor adecuada: en el caso de una gran cantidad de datos exportados, se recomienda utilizar un servidor de alto rendimiento, como uno equipado con más CPU y memoria, para mejorar la capacidad y velocidad de procesamiento del sistema.
  5. Establezca razonablemente la asignación de memoria de JVM: si la asignación de memoria de JVM no es razonable, puede causar problemas como el desbordamiento de memoria. La asignación de memoria de la JVM se puede establecer razonablemente ajustando parámetros como -Xmx y -Xms.

Agregue las siguientes dependencias al archivo pom.xml:

<dependencies>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>4.1.2</version>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>4.1.2</version>
    </dependency>
</dependencies>
public void exportExcel() throws Exception{
    // 加载驱动程序
    Class.forName("com.mysql.cj.jdbc.Driver");

    // 连接数据库
    Connection conn = DriverManager.getConnection(url, username, password);

    // 查询语句
    String sql = "SELECT * FROM user";
    Statement stmt = conn.createStatement();
    ResultSet rs = null;

    // 创建一个 Excel 文档
    SXSSFWorkbook workbook = new SXSSFWorkbook(100);

    try {
        // 设置表格格式
        Sheet sheet = workbook.createSheet("数据导出");
        Row headerRow = sheet.createRow(0);
        String[] headers = {
     
     "ID", "姓名", "年龄"};
        for (int i = 0; i < headers.length; i++) {
            Cell cell = headerRow.createCell(i);
            cell.setCellValue(headers[i]);
        }
        
        int rownum = 1;
        while (true) {
            rs = stmt.executeQuery(sql + " LIMIT " + rownum + ", 10000"); // 每次查询10000条数据

            if (!rs.next()) { // 数据已经读取完
                rs.close();
                break;
            }

            do {
                Row row = sheet.createRow(rownum++);
                String id = rs.getString("id");
                String name = rs.getString("name");
                String age = rs.getString("age");

                row.createCell(0).setCellValue(id);
                row.createCell(1).setCellValue(name);
                row.createCell(2).setCellValue(age);
            } while (rs.next());

            ((SXSSFSheet) sheet).flushRows();
            ((SXSSFSheet) sheet).clearRowBreaks();
        }

        // 保存 Excel 文件
        FileOutputStream out = new FileOutputStream("数据导出.xlsx");
        workbook.write(out);
        out.close();

    } finally {
        // 关闭连接
        if (rs != null) { rs.close(); }
        stmt.close();
        conn.close();

        // 释放资源
        workbook.dispose();
    }

}

Las medidas de optimización, como la lectura de datos en lotes, el uso de la escritura de transmisión, la configuración de un tamaño de caché razonable y el cierre de conexiones innecesarias han mejorado enormemente la eficiencia y la estabilidad del código. Al mismo tiempo, también se recomienda tratar de evitar exportar todos los datos a la vez al exportar. Para millones de datos, puede exportarlos en páginas similares al ejemplo anterior.

Supongo que te gusta

Origin blog.csdn.net/a913222/article/details/130354159
Recomendado
Clasificación