21xrx.com
2025-04-28 03:17:36 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 和页码。

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

  
  

评论区