使用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&useUnicode=true&characterEncoding=utf-8&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、选中项目里的驱动包,右键->Build Path->Add to Build Path 2、在类里写代码加载驱:决定连接哪种数据库 a、Class.forName("com.mysql.jdbc.Driver");b...
java使用jdbc连接mysql数据库,表里有记录,但是查询的结果集为空,是什么...
回答:如果数据库表中有记录,就证明你的插入没有问题,但是查询为空,检查下你的查询语句,直接使用sysout.out.println()输出看看.我们对于JAVA初学者和自学者,对JAVASE、JAVAEE和三大框架进行辅导,如果需要详细了解,请查看我资料的网址连接,我们一定耐心为你解答。