0
点赞
收藏
分享

微信扫一扫

Java 切片多线程批量执行MySQL 示例

在 Java 中使用多线程批量执行 MySQL 操作是一个常见的需求,特别是在处理大量数据时。为了提高性能和效率,可以将数据切分成多个部分,然后在多个线程中并行执行数据库操作。下面是一个简单的示例,展示如何实现这一点。

示例代码

1. 依赖库

首先,确保你的项目中包含了必要的依赖库,例如 JDBC 驱动。

<!-- Maven pom.xml -->
<dependencies>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.23</version>
    </dependency>
</dependencies>

2. 数据切片

假设我们有一个列表 dataList,需要将其切分成多个子列表。

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class MultiThreadedBatchExecution {

    public static void main(String[] args) {
        // 示例数据
        List<String> dataList = new ArrayList<>();
        for (int i = 0; i < 10000; i++) {
            dataList.add("Data " + i);
        }

        // 切片大小
        int sliceSize = 1000;
        List<List<String>> slices = new ArrayList<>();

        // 切片数据
        for (int i = 0; i < dataList.size(); i += sliceSize) {
            int end = Math.min(i + sliceSize, dataList.size());
            slices.add(dataList.subList(i, end));
        }

        // 创建固定线程池
        ExecutorService executorService = Executors.newFixedThreadPool(10);

        // 提交任务
        for (List<String> slice : slices) {
            executorService.submit(new BatchTask(slice));
        }

        // 关闭线程池
        executorService.shutdown();
        try {
            executorService.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

3. 批量任务类

创建一个 BatchTask 类来处理每个切片的数据。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.List;

public class BatchTask implements Runnable {

    private final List<String> dataSlice;

    public BatchTask(List<String> dataSlice) {
        this.dataSlice = dataSlice;
    }

    @Override
    public void run() {
        String url = "jdbc:mysql://localhost:3306/your_database";
        String user = "your_username";
        String password = "your_password";

        try (Connection connection = DriverManager.getConnection(url, user, password)) {
            String sql = "INSERT INTO your_table (column_name) VALUES (?)";
            try (PreparedStatement ps = connection.prepareStatement(sql)) {
                for (String data : dataSlice) {
                    ps.setString(1, data);
                    ps.addBatch();
                }
                ps.executeBatch();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

解释

  1. 数据切片
  • 将 dataList 切分成多个子列表 slices,每个子列表的大小为 sliceSize
  • 使用 subList 方法从 dataList 中提取子列表。
  1. 线程池
  • 创建一个固定大小的线程池 ExecutorService,线程池的大小可以根据实际需求调整。
  • 使用 executorService.submit 方法提交每个切片的任务到线程池中。
  1. 批量任务类
  • BatchTask 类实现了 Runnable 接口,每个任务负责处理一个切片的数据。
  • 在 run 方法中,建立数据库连接,准备 PreparedStatement,并使用 addBatch 方法将所有数据添加到批处理中,最后调用 executeBatch 方法执行批处理。

注意事项

  • 事务管理:如果需要事务管理,可以在每个任务中开启事务,处理完所有数据后再提交事务。
  • 异常处理:在实际应用中,需要对异常进行更详细的处理,例如记录日志、重试机制等。
  • 资源管理:确保在任务完成后关闭数据库连接和其他资源,避免资源泄露。

通过这种方式,可以高效地利用多线程并行处理大量数据,提高系统的整体性能。


举报

相关推荐

0 条评论