获取list中的数据使用多线程执行入库

1.将list分割并用多线程处理

private SyncRespData dealListByPool(List<Map<String,Object>> list, int nThreads, String uniqueCode) throws Exception {
        if (list == null || list.isEmpty()) {
            throw new NullPointerException("the collection is null");
        }

        //计算每个分组存多个数据

        int capactiy = list.size() % nThreads > 0 ? list.size() / nThreads : list.size() / nThreads + 1;
        if(list.size()<16){
            capactiy=1;
        }
        //进行数据分组(分任务)例如,对包含[a,b,c,d,e]的列表进行分区,分区大小为3,得到[[a,b,c],[d,e]]——一个包含三个和两个元素的两个内部列表的外部列表,所有列表都按原始顺序排列。
        List<List<Map<String,Object>>> partions = Lists.partition(list, capactiy);
        // 创建一个临时的局部线程池(固定大小)
        ExecutorService executorService = Executors.newFixedThreadPool(nThreads);
        // 保存结果
        List<Future<SyncRespData>> futures = new ArrayList<Future<SyncRespData>>(partions.size());

        // 分配任务
        f
在Spring框架中实现多线程处理数据入库的简单方法,可以通过以下步骤进行。该方法利用了Spring的线程池管理能力和事务控制机制,确保数据处理的高效性和一致性。 ### 配置线程池 首先,在Spring中配置一个线程池,用于管理和调度线程。可以通过`@Configuration`类来定义线程池的Bean。 ```java package com.example.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import java.util.concurrent.Executor; @Configuration public class ThreadPoolConfig { @Bean(name = "dataProcessingExecutor") public Executor dataProcessingExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(5); // 核心线程数 executor.setMaxPoolSize(10); // 最大线程数 executor.setQueueCapacity(100); // 队列大小 executor.setThreadNamePrefix("data-processing-"); // 线程名称前缀 executor.initialize(); return executor; } } ``` ### 定义数据处理任务 接下来,定义一个实现了`Runnable`接口的任务类,用于处理数据并插入数据库。该任务类可以注入Spring管理的Bean,例如`JdbcTemplate`或`EntityManager`。 ```java package com.example.service; import com.example.entity.TestEntity; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Service; import java.util.List; @Service public class DataProcessingTask implements Runnable { private final List<TestEntity> dataList; private final JdbcTemplate jdbcTemplate; @Autowired public DataProcessingTask(List<TestEntity> dataList, JdbcTemplate jdbcTemplate) { this.dataList = dataList; this.jdbcTemplate = jdbcTemplate; } @Override public void run() { for (TestEntity entity : dataList) { String sql = "INSERT INTO test_table (id, name) VALUES (?, ?)"; jdbcTemplate.update(sql, entity.getId(), entity.getName()); } } } ``` ### 分割数据并启动多线程处理 在主服务中,将数据分割成多个子集,并为每个子集提交一个任务到线程池中执行。 ```java package com.example.service; import com.example.entity.TestEntity; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.stereotype.Service; import java.util.List; import java.util.concurrent.Executor; @Service public class DataProcessingService { private final Executor executor; private final DataProcessingTaskFactory dataProcessingTaskFactory; @Autowired public DataProcessingService(@Qualifier("dataProcessingExecutor") Executor executor, DataProcessingTaskFactory dataProcessingTaskFactory) { this.executor = executor; this.dataProcessingTaskFactory = dataProcessingTaskFactory; } public void processData(List<TestEntity> dataList) { int batchSize = 100; // 每个线程处理数据量 int totalSize = dataList.size(); int numberOfBatches = (int) Math.ceil((double) totalSize / batchSize); for (int i = 0; i < numberOfBatches; i++) { int start = i * batchSize; int end = Math.min(start + batchSize, totalSize); List<TestEntity> subList = dataList.subList(start, end); DataProcessingTask task = dataProcessingTaskFactory.create(subList); executor.execute(task); } } } ``` ### 工厂类用于创建任务实例 为了能够通过Spring管理`DataProcessingTask`的实例,可以创建一个工厂类。 ```java package com.example.service; import com.example.entity.TestEntity; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Component; import java.util.List; @Component public class DataProcessingTaskFactory { private final JdbcTemplate jdbcTemplate; @Autowired public DataProcessingTaskFactory(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } public DataProcessingTask create(List<TestEntity> dataList) { return new DataProcessingTask(dataList, jdbcTemplate); } } ``` ### 实体类 定义一个简单的实体类,表示要插入的数据。 ```java package com.example.entity; import lombok.Data; @Data public class TestEntity { private String id; private String name; } ``` ### Mapper接口(可选) 如果使用MyBatis或其他ORM框架,可以定义一个Mapper接口来操作数据库。 ```java package com.example.mapper; import com.example.entity.TestEntity; import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Mapper; @Mapper public interface TestEntityMapper { @Insert("INSERT INTO test_table (id, name) VALUES (#{id}, #{name})") void insert(TestEntity entity); } ``` ### 总结 通过上述步骤,可以在Spring框架中实现多线程处理数据入库的简单方法。该方法利用了Spring的线程池管理、事务控制和依赖注入功能,确保数据处理的高效性和一致性。具体实现包括配置线程池、定义数据处理任务、分割数据并启动多线程处理等步骤。这种方式不仅提高了数据处理的效率,还保持了代码的清晰和可维护性[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

iamlzjoco

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值