问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

使用JDBC在MySQL数据库中如何快速批量插入数据

发布网友 发布时间:2023-07-31 19:47

我来回答

1个回答

热心网友 时间:2023-09-15 07:27



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


在JDBC编程接口中Statement 有两个方法特别值得注意:


Adds a set of parameters to this PreparedStatement object's batch of commands.


Submits a batch of commands to the database for execution and if all commands execute successfully, returns an array of update counts. The int elements of the array that is returned are ordered to correspond to the commands in the batch, which are ordered according to the order in which they were added to the batch.

通过使用addBatch()和executeBatch()这一对方法可以实现批量处理数据。

不过值得注意的是,首先需要在数据库链接中设置手动提交,connection.setAutoCommit(false),然后在执行Statement之后执行connection.commit()。


package cyl.demo.ipsearcher;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class DbStoreHelper {

private String insert_sql;
private String charset;
private boolean debug;

private String connectStr;
private String username;
private String password;

public DbStoreHelper() {
connectStr = "jdbc:mysql://localhost:3306/db_ip";
// connectStr += "?useServerPrepStmts=false&rewriteBatchedStatements=true";
insert_sql = "INSERT INTO tb_ipinfos (iplong1,iplong2,ipstr1,ipstr2,ipdesc) VALUES (?,?,?,?,?)";
charset = "gbk";
debug = true;
username = "root";
password = "***";
}

public void storeToDb(String srcFile) throws IOException {
BufferedReader bfr = new BufferedReader(new InputStreamReader(new FileInputStream(srcFile), charset));
try {
doStore(bfr);
} catch (Exception e) {
e.printStackTrace();
} finally {
bfr.close();
}
}

private void doStore(BufferedReader bfr) throws ClassNotFoundException, SQLException, IOException {
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection(connectStr, username,password);
conn.setAutoCommit(false); // 设置手动提交
int count = 0;
PreparedStatement psts = conn.prepareStatement(insert_sql);
String line = null;
while (null != (line = bfr.readLine())) {
String[] infos = line.split(";");
if (infos.length < 5) continue;
if (debug) {
System.out.println(line);
}
psts.setLong(1, Long.valueOf(infos[0]));
psts.setLong(2, Long.valueOf(infos[1]));
psts.setString(3, infos[2]);
psts.setString(4, infos[3]);
psts.setString(5, infos[4]);
psts.addBatch(); // 加入批量处理
count++;
}
psts.executeBatch(); // 执行批量处理
conn.commit(); // 提交
System.out.println("All down : " + count);
conn.close();
}

}
执行完成以后:


All down : 103498
Convert finished.
All spend time/s : 47


一共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";

再次执行如下:


All down : 103498
Convert finished.
All spend time/s : 10


同样的数据量,这次执行只花费了10秒 ,处理效率大大提高.


使用JDBC在MySQL数据库中如何快速批量插入数据

不过值得注意的是,首先需要在数据库链接中设置手动提交,connection.setAutoCommit(false),然后在执行Statement之后执行connection.commit()。package cyl.demo.ipsearcher; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; i...

JMeter JDBC Request(实现往mysql批量造数)

1. 首先,确保你安装了MySQL数据库和Navicat Premium作为管理工具。接着,将mysql-connector-java-8.0.11.jar包添加到JMeter的lib目录或者通过测试计划中的配置元件添加。2. 在测试计划中,使用JDBC Connection Configuration组件配置数据库连接,包括连接名、密码等必要信息。确保与JDBC Requst中的Variable N...

mysql大量数据插入慢的问题

MySQL Jdbc驱动在默认情况下会无视executeBatch()语句,把我们期望批量执行的一组sql语句拆散,一条一条地发给MySQL数据库,直接造成较低的性能。 只有把rewriteBatchedStatements参数置为true, 驱动才会帮你批量执行SQL (jdbc:mysql://ip:port/db?rewriteBatchedStatements=true)。不过,驱动具体是怎么样批量执行的? 你...

1亿条数据批量插入 MySQL,哪种方式最快?

Mybatis轻量级插入:虽然Mybatis因其轻便性而高效,但在处理大规模数据时,由于ORM转换和未开启事务,插入52万条数据耗时约7到9分钟,对1万条数据的插入也需28.6秒。JDBC直接处理:开启事务后,插入10万数据的时间缩短至3.9秒/万条,而无事务状态下则为21.2秒/万条。JDBC批处理:无论是开启还是关...

12秒将百万数据通过EasyExcel导入MySQL数据库中

最后,我们采用了多线程+Mybatis-Plus批量插入的策略,通过自定义XML文件手动拼接SQL语句实现真正的批量插入。这种优化显著地将导入时间降低到平均20秒,大大提升了用户体验,尤其是考虑到处理大数据Excel文件时的打开时间。总结来说,通过对EasyExcel的性能优化,我们成功地将导入百万数据的时间从500秒降低到20...

java,jdbc,大量数据update更新效率很慢,哪位大神可怜可怜我吧

mysql使用jdbc的批量插入需要在连接Mysql的地方加上rewriteBatchedStatements=true ,也就是spring.datasource.url = jdbc:mysql://192.168.15.44:3306/ml_test?useSSL=false&amp;useUnicode=true&amp;characterEncoding=utf-8&amp;rewriteBatchedStatements=true ,如果不加这个的话,和自己循环插入差不多 ...

java 怎么把5万条数据分批插入数据到mysql,之前插1,2万没事, 多了就...

大量数据插入的时候,可以将数据量分批,每次事务提交一批。例如:con.setAutoCommit(false);// 更改JDBC事务的默认提交方式 Statement stmt = conn.createStatement();// 第一批 省略n条 stmt.addBatch("insert into dept values (52,'a','aa')");stmt.addBatch("insert into dept values (53,'...

如何在eclipse中通过jdbc连接mysql数据库

1.在新建的Project中右键新建Floder 2 2.创建名为lib的包 3.创建完毕之后的工程目录 4.接下来解压你下载的mysql的jar包,拷贝其中的.jar文件 5.在工程lib包下邮件 选择paste即粘贴,把mysql的jar包拷贝进来 6.拷贝完毕如图:7.在mysql的jar包上右键选择 build path - add to build path 8.添加...

用java连接mysql实现对表中的数据查找,插入,修改等功能,

1、准备MySQL数据库驱动包:mysql-connector-java-5.0.8-bin.jar,一个项目中只能存在一个版本的驱动包 a、复制该驱动包,粘贴到项目中 b、选中项目里的驱动包,右键-&gt;Build Path-&gt;Add to Build Path 2、在类里写代码加载驱:决定连接哪种数据库 a、Class.forName("com.mysql.jdbc.Driver");b...

java使用jdbc连接mysql数据库,表里有记录,但是查询的结果集为空,是什么...

回答:如果数据库表中有记录,就证明你的插入没有问题,但是查询为空,检查下你的查询语句,直接使用sysout.out.println()输出看看.我们对于JAVA初学者和自学者,对JAVASE、JAVAEE和三大框架进行辅导,如果需要详细了解,请查看我资料的网址连接,我们一定耐心为你解答。

MySQL创建数据库表 数据库使用 如何建立数据库 数据库怎么用 常用的数据库有哪些 常用数据库 mysql怎么建立数据库 数据库有哪些 数据库
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
云裳羽衣普通6-4完美攻略介绍_云裳羽衣普通6-4完美攻略是什么 ...长期在深圳工作。那我可以在深圳续签港澳通行证吗?是续签喔,_百度... 云裳羽衣第五章怎么过 第五章普通完美攻略 消防法规中规定发生火灾时的处置方法有哪些规定 火灾扑救的基本原则是什么答案 请教专家朝鲜缺的衣食同等商品按中朝汇率和价格差异来看挣钱不?_百度... ...想请教一下高手指点我一下。柿子做法的步骤,如何晒,如果白天晒,晚 ... 如何看待闪婚的林志玲夫妇? 闪婚真的可以幸福吗,有什么弊端呢? 大闸蟹在鱼缸里用什么水养好 齐秦中国之星踢馆成功了吗 男孩对女孩说帮我介绍个女朋友,女孩该怎么回答? ...说自己还是单身 给他介绍个啊 这个女的该怎么回? 男人对陌生女人做自我介绍,该怎么回答? 喜欢的男生给我介绍了一个对象,我应该怎么回应他比较好?? 阴道内出现很多像蛋白的分秘物,请问是什么 上海市青浦区到浙江省绍兴市嵊州市多远的路程 嵊州天花大厦是个什么地方 相公殿社区属于哪里 深牢大狱电视剧童蕾被剪头发第几集 有三个剪头发的高手和一个女孩子的故事是一部电视剧名叫魔法&#xFFFD; 非全日制劳动合同的终止,有那些特点: 得了脑结核,肺结核怎么办 cake和fork隐晦意思 老年人同时患有结核性脑膜炎和肺结核该如何治疗 我得了脑结核,和肺结核,现在还在吃药阶段,每个月要去医院抽一次血做检查... 肺结核和脑部结核的病人饮食和生活上有什么要注意的 电冰箱的制冷系统蒸发温度如何控制 高分求解答,急!!! 请问有没有人知道银行利率是怎么算的 聊城二院儿科主任王道坊哪天上班呀 上海复旦大学儿科的周水珍都是星期几上班?号好挂吗? 福克斯加装导航仪表怎么拆 白带常规检查不出来是什么原因 游记散文集《屐痕处处》的作者是谁? 新福克斯飞歌导航存储卡如何取出 阴道痒做白带检查查不出什么原因 宁夏高考报名人数 碌碌无为的生肖 一道一次函数应用题(2011大连市中考一模试题) 谁有几道初中数学一次函数与实际应用题???帮帮忙要中考了 我儿子是2013年05月13日下午1点37出生的是什么命阿,请... 属龙人农历5月13日中午一点左右出生年的命运 民事法律关系和民事法律行为区别是什么 民事行为、民事法律行为、民事法律关系三者之间有什么联系与区别 法律事实和法律关系的区别 《决策大脑》pdf下载在线阅读全文,求百度网盘云资源 请问今年8月3日去门源还能看油菜花吗 ...门源的油菜花会不会花期晚一些呢?8月初去还能看到油菜花么?_百度知 ... 马鞍山幼儿师范学校怎么样 好不好