java 多线程批量修改数据

时间: 2023-11-24 22:51:29 浏览: 33
以下是Java多线程批量修改数据的示例代码: ```java import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class BatchUpdateDemo { private static final String URL = "jdbc:mysql://localhost:3306/test"; private static final String USER = "root"; private static final String PASSWORD = "123456"; public static void main(String[] args) { Connection conn = null; PreparedStatement pstmt = null; try { Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection(URL, USER, PASSWORD); conn.setAutoCommit(false); String sql = "update user set age = ? where id = ?"; pstmt = conn.prepareStatement(sql); // 模拟需要修改的数据 int[] ids = {1, 2, 3, 4, 5}; int[] ages = {20,21, 22, 23, 24}; // 创建线程池 ExecutorService executorService = Executors.newFixedThreadPool(5); // 批量修改数据 for (int i = 0; i < ids.length; i++) { int id = ids[i]; int age = ages[i]; executorService.execute(() -> { try { pstmt.setInt(1, age); pstmt.setInt(2, id); pstmt.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); } }); } // 关闭线程池 executorService.shutdown(); while (!executorService.isTerminated()) { Thread.sleep(100); } // 提交事务 conn.commit(); } catch (ClassNotFoundException | SQLException | InterruptedException e) { e.printStackTrace(); try { if (conn != null) { conn.rollback(); } } catch (SQLException ex) { ex.printStackTrace(); } } finally { try { if (pstmt != null) { pstmt.close(); } if (conn != null) { conn.close(); } } catch (SQLException e) { e.printStackTrace(); } } } } ``` 该示例代码使用了线程池来批量修改数据,通过创建一个固定大小的线程池,将每个修改操作封装成一个任务,交给线程池去执行。这样可以避免频繁地创建和销毁线程,提高了程序的性能。

相关推荐

下面是Java实现多线程分页插入数据的示例代码: java import java.sql.*; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class MultiThreadInsert { public static void main(String[] args) { String url = "jdbc:mysql://localhost:3306/test"; String username = "root"; String password = "123456"; ExecutorService executorService = Executors.newFixedThreadPool(10); try{ Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection(url, username, password); String sql = "INSERT INTO user(name, age) VALUES(?, ?)"; PreparedStatement ps = conn.prepareStatement(sql); int pageSize = 1000; //每页大小 int total = 1000000; //总数据量 int totalPages = total / pageSize; //总页数 for (int i = 0; i < totalPages; i++){ int currentPage = i + 1; int start = i * pageSize; int end = (i + 1) * pageSize; executorService.execute(new InsertDataThread(ps, start, end)); } executorService.shutdown(); }catch (Exception e){ e.printStackTrace(); } } static class InsertDataThread implements Runnable { private PreparedStatement ps; private int start; private int end; public InsertDataThread(PreparedStatement ps, int start, int end){ this.ps = ps; this.start = start; this.end = end; } public void run(){ try{ for (int i = start; i < end; i++){ ps.setString(1, "user" + i); ps.setInt(2, i % 100); ps.addBatch(); if (i % 1000 == 0){ ps.executeBatch(); ps.clearBatch(); } } }catch (Exception e){ e.printStackTrace(); } } } } 代码中使用了Java的线程池ExecutorService来管理线程,通过构造函数传入PreparedStatement对象和起始位置、结束位置,然后在run()方法中执行批量插入操作。每1000条数据执行一次批量插入操作。可以通过修改pageSize和total参数来修改每页大小和总数据量。
您好!以下是使用Java线程池实现批量下载文件的示例代码: java import java.io.BufferedInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.net.URL; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class FileDownloader { private static final int NUM_THREADS = 5; // 线程池中的线程数量 public static void main(String[] args) { List<String> fileUrls = new ArrayList<>(); fileUrls.add("https://example.com/file1.txt"); fileUrls.add("https://example.com/file2.txt"); fileUrls.add("https://example.com/file3.txt"); // 添加更多文件URL到fileUrls列表中 ExecutorService executor = Executors.newFixedThreadPool(NUM_THREADS); for (String fileUrl : fileUrls) { executor.execute(() -> { try { downloadFile(fileUrl); } catch (IOException e) { e.printStackTrace(); } }); } executor.shutdown(); } private static void downloadFile(String fileUrl) throws IOException { URL url = new URL(fileUrl); String fileName = getFileNameFromUrl(url); try (BufferedInputStream in = new BufferedInputStream(url.openStream()); FileOutputStream fileOutputStream = new FileOutputStream(fileName)) { byte[] dataBuffer = new byte[1024]; int bytesRead; while ((bytesRead = in.read(dataBuffer, 0, 1024)) != -1) { fileOutputStream.write(dataBuffer, 0, bytesRead); } } catch (IOException e) { throw e; } System.out.println("Downloaded: " + fileName); } private static String getFileNameFromUrl(URL url) { String[] segments = url.getFile().split("/"); return segments[segments.length - 1]; } } 这段代码创建了一个存储文件URL的列表 fileUrls,然后使用线程池 ExecutorService 将每个文件的下载任务提交给线程池执行。在 downloadFile 方法中,使用输入流从URL中读取文件数据,并使用输出流将数据写入磁盘。每个下载任务都在单独的线程中执行。 请注意,此示例仅演示了如何使用线程池实现批量下载文件,并没有处理下载失败、错误处理等其他细节。根据您的实际需求,您可能需要根据情况进行适当的修改和改进。 希望能对您有所帮助!如果您有任何其他问题,请随时提问。
EasyExcel多线程导入的教程可以分为以下几个步骤: 1. 准备工作: 在开始之前,需要先修改数据库表,修改application配置文件,增加Tomcat的最大文件上传限制以便上传大文件,并开启MyBatis-Plus的批量插入功能(如果你的项目不使用MyBatis-Plus或者已经具备批量插入功能,则可以跳过此步骤)。此外,还需要创建一些用于多线程导入的接口所需的类。 2. 引入EasyExcel工具: 首先,需要在项目中引入EasyExcel工具,这是一款非常方便的处理Excel文件的工具。你可以通过在pom.xml文件中添加相关依赖来引入EasyExcel。然后,你可以使用EasyExcel提供的API来读取Excel文件中的数据。 3. 多线程导入: 为了支持大数据量的导入,我们可以使用线程池来进行多线程处理。在导入过程中,将Excel文件分割成多个小块,每个线程负责处理其中的一块。这样可以提高导入的速度和效率。你可以使用Java的线程池来实现多线程导入功能。 4. 处理数据类型不满足的情况: 在导入过程中,可能会遇到一些数据类型不满足入参的情况。为了解决这个问题,可以使用工具类来处理这些数据类型不匹配的情况。 综上所述,以上就是EasyExcel多线程导入的教程。你可以根据需要按照这些步骤来进行操作。123 #### 引用[.reference_title] - *1* *2* *3* [【二十四】springboot使用EasyExcel和线程池实现多线程导入Excel数据](https://blog.csdn.net/weixin_56995925/article/details/125944749)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
线程池可以用来优化向数据库批量插入数据的性能。以下是一种简单的实现方式: 1. 创建一个线程池,线程池的大小根据你的机器性能和数据库负载情况来配置。 2. 将需要插入的数据按照一定的规则划分成多个小批次。 3. 创建一个任务队列,将每个小批次的数据都封装成一个任务,并放入任务队列中。 4. 线程池中的每个线程从任务队列中取出一个任务,执行该任务中的插入操作。 5. 执行完任务后,线程将结果返回给主线程,并继续从任务队列中取出下一个任务执行。 6. 主线程等待所有任务执行完毕后,关闭线程池。 以下是一个简单的Java代码示例: java import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class DatabaseInsertThreadPool { private ExecutorService executorService; public DatabaseInsertThreadPool(int poolSize) { executorService = Executors.newFixedThreadPool(poolSize); } public void insertDataToDatabase(Data data) { // 将数据按照一定的规则划分成多个小批次 List> dataBatches = splitDataIntoBatches(data); // 将每个小批次的数据都封装成一个任务,并放入任务队列中 for (List<Data> dataBatch : dataBatches) { executorService.submit(() -> { // 执行该任务中的插入操作 insertDataBatchToDatabase(dataBatch); }); } } public void shutdown() { executorService.shutdown(); } private List> splitDataIntoBatches(Data data) { // 将数据按照一定的规则划分成多个小批次 ... } private void insertDataBatchToDatabase(List<Data> dataBatch) { // 将数据批量插入到数据库中 ... } } 你可以根据自己的具体需求来修改代码。
ConcurrentHashMap是Java中线程安全的哈希表实现,它提供了比Hashtable和SynchronizedMap更好的并发性能和可伸缩性。 ConcurrentHashMap的实现原理主要包括以下几个方面: 1. 分段锁设计 ConcurrentHashMap将整个Map分成了多个Segment,每个Segment默认是一个长度为16的数组(可以通过构造函数指定长度)。每个Segment维护了一个HashEntry数组和一个Segment锁。在ConcurrentHashMap中,所有的操作都是在Segment的粒度上进行的,不同的Segment之间可以并发操作。 2. Hash表和Hash算法 ConcurrentHashMap的底层数据结构是一个哈希表,每个元素是一个HashEntry,其中包含了key、value和next指针。在ConcurrentHashMap中,使用了一种称为“位运算”的Hash算法,可以在不需要锁的情况下计算出每个元素的位置,从而提高了并发性能。 3. CAS操作 在ConcurrentHashMap中,使用了CAS(Compare And Swap)操作来保证线程安全,而不是像Hashtable和SynchronizedMap一样使用全局锁。通过CAS操作,可以在不加锁的情况下对某个元素进行修改,从而提高了并发性能。 4. Jdk1.8的改进 在Jdk1.8中,ConcurrentHashMap的实现进行了一些改进,主要包括了以下几个方面: - Segment被废弃了,使用Node数组代替; - 使用了红黑树来优化链表的查找性能; - 使用了批量操作来减少CAS操作的次数,提高了并发性能。 总的来说,ConcurrentHashMap的实现原理是通过分段锁、哈希表和CAS操作来保证线程安全,同时利用了JDK1.8的一些改进来提高并发性能。

最新推荐

Python代码源码-实操案例-框架案例-如何检测输入的图片验证码是否正确….zip

Python代码源码-实操案例-框架案例-如何检测输入的图片验证码是否正确….zip

TA_Lib-0.4.28-cp39-cp39-win32.whl.zip

whl文件

医院固定资产-医院固定资产系统-医院固定资产系统源码-医院固定资产管理系统-基于Web的医院固定资产系统设计与实现-java代码

医院固定资产-医院固定资产系统-医院固定资产系统源码-医院固定资产管理系统-医院固定资产管理系统java代码-医院固定资产系统设计与实现-基于springboot的医院固定资产系统-基于Web的医院固定资产系统设计与实现-医院固定资产网站-医院固定资产网站代码-医院固定资产平台-医院固定资产平台代码-医院固定资产项目-医院固定资产项目代码-医院固定资产代码 1、技术栈:java,springboot,vue,ajax,maven,mysql,MyBatisPlus等 开发语言:Java 框架:SpringBoot JDK版本:JDK1.8 数据库:mysql 5.7 数据库工具:SQLyog/Navicat 开发软件:eclipse/myeclipse/idea Maven包:Maven 浏览器:谷歌浏览器 2、系统的实现 用户信息 图片素材 视频素材 摘 要 I 目 录 III 第1章 绪论 1 1.1选题动因 1 1.2背景与意义 1 第2章 相关技术介绍 3 2.1 MySQL数据库 3 2.2 Vue前端技术 3 2.3 B/S架构模式 4 2.4 ElementUI介

【CVRP】基于matlab蚁群算法求解带容量的车辆路径规划问题【含Matlab源码 2635期】.mp4

CSDN佛怒唐莲上传的视频均有对应的完整代码,皆可运行,亲测可用,适合小白; 1、代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主或扫描视频QQ名片; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

【ETWVRP】基于matlab遗传算法求解带时间窗的含充电站车辆路径规划问题【含Matlab源码 1221期】.mp4

CSDN佛怒唐莲上传的视频均有对应的完整代码,皆可运行,亲测可用,适合小白; 1、代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主或扫描视频QQ名片; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

面向6G的编码调制和波形技术.docx

面向6G的编码调制和波形技术.docx

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire

Power BI中的数据导入技巧

# 1. Power BI简介 ## 1.1 Power BI概述 Power BI是由微软公司推出的一款业界领先的商业智能工具,通过强大的数据分析和可视化功能,帮助用户快速理解数据,并从中获取商业见解。它包括 Power BI Desktop、Power BI Service 以及 Power BI Mobile 等应用程序。 ## 1.2 Power BI的优势 - 基于云端的数据存储和分享 - 丰富的数据连接选项和转换功能 - 强大的数据可视化能力 - 内置的人工智能分析功能 - 完善的安全性和合规性 ## 1.3 Power BI在数据处理中的应用 Power BI在数据处

建立关于x1,x2 和x1x2 的 Logistic 回归方程.

假设我们有一个包含两个特征(x1和x2)和一个二元目标变量(y)的数据集。我们可以使用逻辑回归模型来建立x1、x2和x1x2对y的影响关系。 逻辑回归模型的一般形式是: p(y=1|x1,x2) = σ(β0 + β1x1 + β2x2 + β3x1x2) 其中,σ是sigmoid函数,β0、β1、β2和β3是需要估计的系数。 这个方程表达的是当x1、x2和x1x2的值给定时,y等于1的概率。我们可以通过最大化似然函数来估计模型参数,或者使用梯度下降等优化算法来最小化成本函数来实现此目的。

智能网联汽车技术期末考试卷B.docx

。。。