使用JDBC连接MySQL数据库进行数据插入的时候,特别是大批量数据连续插入(100000),如何提高效率呢?

在JDBC编程接口中Statement 有两个方法特别值得注意:
通过使用addBatch()和executeBatch()这一对方法可以实现批量处理数据。
不过值得注意的是,首先需要在数据库链接中设置手动提交,connection.setAutoCommit(false),然后在执行Statement之后执行connection.commit()。
import java.io.BufferedReader;
import java.io.IOException;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Date;
import com.mysql.jdbc.Connection;
public class MysqlBatchUtil {
private String sql="INSERT INTO db_test (param1,param2,param3,param4,param5) VALUES (?,?,?,?,?)";
private String charset="utf-8";
private String connectStr="jdbc:mysql://localhost:3306/test";
private String username="root";
private String password="123456";
private void doStore() throws ClassNotFoundException, SQLException, IOException {
Class.forName("com.mysql.jdbc.Driver");
connectStr += "?useServerPrepStmts=false&rewriteBatchedStatements=true";//此处是测试高效批次插入,去掉之后执行时普通批次插入
Connection conn = (Connection) DriverManager.getConnection(connectStr, username,password);
conn.setAutoCommit(false); // 设置手动提交
int count = 0;
PreparedStatement psts = conn.prepareStatement(sql);
String line = null;
Date begin=new Date();
for(int i=0;i<=100000;i++){
psts.setString(1, i+"param1");
psts.setString(2, i+"param2");
psts.setString(3, i+"param3");
psts.setString(4, i+"param4");
psts.setString(5, i+"param5");
psts.addBatch(); // 加入批量处理
count++;
}
psts.executeBatch(); // 执行批量处理
conn.commit(); // 提交
Date end=new Date();
System.out.println("数量="+count);
System.out.println("运行时间="+(end.getTime()-begin.getTime()));
conn.close();
}
public static void main(String[] args) {
try {
new MysqlBatchUtil().doStore();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
测试结果:
数量=100001
运行时间=4725
一共10W,执行时间一共花费 47 秒.
这个效率仍然不高,似乎没有达到想要的效果,需要进一步改进。
在MySQL JDBC连接字符串中还可以加入参数,
rewriteBatchedStatements=true
mysql默认关闭了batch处理,通过此参数进行打开,这个参数可以重写向数据库提交的SQL语句
useServerPrepStmts=false
如果不开启(useServerPrepStmts=false),使用com.mysql.jdbc.PreparedStatement进行本地SQL拼装,最后送到db上就是已经替换了?后的最终SQL.
在此稍加改进,连接字符串中加入下面语句(代码构造方法中去掉注释):
connectStr += "?useServerPrepStmts=false&rewriteBatchedStatements=true";
再次测试结果如下:
数量=100001
运行时间=1213
同样的数据量,这次执行只花费了12秒 ,由此可见处理效率大大提高,呵呵
以上所述是小编给大家介绍的Java使用JDBC向MySQL数据库批次插入10W条数据测试效率,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
# jdbc
# 数据库批次插入数据
# Java并发编程多线程间的同步控制和通信详解
# Java并发编程之volatile与JMM多线程内存模型
# Java多线程之并发编程的基石CAS机制详解
# Java多线程并发编程和锁原理解析
# 深入理解Java多线程与并发编程
# Java 多线程并发编程提高数据处理效率的详细过程
# 在此
# 小编
# 的是
# 这一
# 还可以
# 执行时间
# 给大家
# 不高
# 重写
# 可以实现
# 所述
# 给我留言
# 感谢大家
# 提高效率
# 疑问请
# 有任何
# 有两个
# 不开启
# 关闭了
# 花费了
相关文章:
建站三合一如何选?哪家性价比更高?
企业网站制作费用多少,企业网站空间一般需要多大,费用是多少?
导航网站建站方案与优化指南:一站式高效搭建技巧解析
网站图片在线制作软件,怎么在图片上做链接?
C++时间戳转换成日期时间的步骤和示例代码
广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?
交易网站制作流程,我想开通一个网站,注册一个交易网址,需要那些手续?
如何在七牛云存储上搭建网站并设置自定义域名?
c++怎么用jemalloc c++替换默认内存分配器【性能】
如何通过免费商城建站系统源码自定义网站主题与功能?
网站制作专业公司有哪些,如何制作一个企业网站,建设网站的基本步骤有哪些?
如何通过智能用户系统一键生成高效建站方案?
公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?
头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?
建站之星ASP如何实现CMS高效搭建与安全管理?
XML的“混合内容”是什么 怎么用DTD或XSD定义
香港服务器WordPress建站指南:SEO优化与高效部署策略
手机怎么制作网站教程步骤,手机怎么做自己的网页链接?
如何制作网站标识牌,动态网站如何制作(教程)?
如何高效生成建站之星成品网站源码?
已有域名建站全流程解析:网站搭建步骤与建站工具选择
如何通过主机屋免费建站教程十分钟搭建网站?
制作网站怎么制作,*游戏网站怎么搭建?
定制建站流程解析:需求评估与SEO优化功能开发指南
如何快速搭建响应式可视化网站?
建站之星后台密码遗忘如何找回?
,想在网上投简历,哪几个网站比较好?
威客平台建站流程解析:高效搭建教程与设计优化方案
香港服务器部署网站为何提示未备案?
大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?
宝塔新建站点为何无法访问?如何排查?
Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解
已有域名能否直接搭建网站?
如何在自有机房高效搭建专业网站?
孙琪峥织梦建站教程如何优化数据库安全?
如何使用Golang安装API文档生成工具_快速生成接口文档
制作门户网站的参考文献在哪,小说网站怎么建立?
重庆市网站制作公司,重庆招聘网站哪个好?
南平网站制作公司,2025年南平市事业单位报名时间?
广东企业建站网站优化与SEO营销核心策略指南
网站规划与制作是什么,电子商务网站系统规划的内容及步骤是什么?
专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?
上海网站制作开发公司,上海买房比较好的网站有哪些?
如何在阿里云购买域名并搭建网站?
如何用已有域名快速搭建网站?
c++怎么实现高并发下的无锁队列_c++ std::atomic原子变量与CAS操作【详解】
如何撰写建站申请书?关键要点有哪些?
山东网站制作公司有哪些,山东大源集团官网?
如何通过PHP快速构建高效问答网站功能?
唐山网站制作公司有哪些,唐山找工作哪个网站最靠谱?
*请认真填写需求信息,我们会在24小时内与您取得联系。