21xrx.com
2024-05-20 00:53:44 Monday
登录
文章检索 我的文章 写文章
Java多线程读取大数据表的代码
2023-07-13 19:35:11 深夜i     --     --
Java 多线程 读取 大数据表 代码

随着数据量的不断增大,大数据处理已经成为了企业中非常重要的一部分。而在处理大数据的过程中,Java多线程技术已经成为了必要的技能。

如果需要在Java中处理大数据表,可以通过使用多线程技术来提高效率。下面是Java多线程读取大数据表的代码示例:


import java.util.*;

import java.io.*;

import java.sql.*;

public class ReadData {

  public static void main(String[] args) {

    // 设定线程个数

    int threadSize = 10;

    // 设定每个线程处理数据的个数

    int pageSize = 10000;

    // 设定总数据的行数

    int totalRows = 1000000;

    // 计算总页数

    int totalPages = (totalRows % pageSize == 0) ? totalRows / pageSize : totalRows / pageSize + 1;

    // 新建线程池

    ExecutorService executorService = Executors.newFixedThreadPool(threadSize);

    // 创建数据源连接

    String url = "jdbc:mysql://localhost:3306/test";

    String username = "root";

    String password = "123456";

    try (Connection conn = DriverManager.getConnection(url, username, password)) {

      String sql = "SELECT * FROM big_data_table WHERE id >= ? AND id <= ?";

      // 循环读取每一页的数据

      for (int i = 1; i <= totalPages; i++) {

        int start = (i - 1) * pageSize + 1;

        int end = start + pageSize - 1;

        // 新建一个线程用于处理一页的数据

        executorService.execute(new ReadDataThread(sql, conn, start, end));

      }

      // 关闭线程池

      executorService.shutdown();

      // 等待所有线程执行完毕

      while (!executorService.isTerminated()) {

        Thread.sleep(1000);

      }

    } catch (Exception e) {

      e.printStackTrace();

    }

  }

}

class ReadDataThread implements Runnable {

  private String sql;

  private Connection conn;

  private int start;

  private int end;

  public ReadDataThread(String sql, Connection conn, int start, int end)

    this.sql = sql;

    this.conn = conn;

    this.start = start;

    this.end = end;

  

  @Override

  public void run() {

    // 定义数据列表

    List<Map<String, Object>> dataList = new ArrayList<>();

    try (PreparedStatement pstmt = conn.prepareStatement(sql)) {

      pstmt.setInt(1, start);

      pstmt.setInt(2, end);

      // 执行查询并获取结果集

      ResultSet rs = pstmt.executeQuery();

      // 将结果集转换为Map

      while (rs.next()) {

        Map<String, Object> data = new HashMap<>();

        // 根据实际情况设置列的名称

        data.put("id", rs.getInt("id"));

        data.put("name", rs.getString("name"));

        data.put("age", rs.getInt("age"));

        dataList.add(data);

      }

      // 处理完一页的数据后,做一些其他操作

      System.out.println("Thread " + Thread.currentThread().getId() + " finished processing page " + (start / end));

    } catch (Exception e) {

      e.printStackTrace();

    }

  }

}

上面的代码中使用了线程池,可以同时处理多个线程,从而提高整个读取大数据表的效率。

其中,`ReadData` 类用于读取大数据表,其中 `threadSize` 用于设定线程个数,`pageSize` 用于设定每个线程处理数据的个数,`totalRows` 用于设定总数据的行数。通过计算得到 `totalPages` 的总页数。

`executorService` 为新建的线程池,`ReadDataThread` 使用的是线程,由 `run()` 方法实现。`sql` 用于查询的 SQL 语句,`conn` 用于连接数据源,`start` 和 `end` 表示待处理数据的起始位置和结束位置。

在 `ReadDataThread` 中,首先定义了数据列表 `dataList`,然后执行 SQL 查询,将结果集转换为 `Map` 并存入 `dataList` 中,最后处理完一页数据后输出线程 ID 和页码。

当所有线程执行完毕后,程序也就运行完成了。通过运用多线程技术,可以达到快速而有效的读取和处理大数据表的目的。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复