jdbc批量插⼊的4种⽅式【百万条数据插⼊只需⼏秒】mysql数据库准备
#打开数据库test01;
use test01;
#创建表a,表a包含int型的id列、可变长度型的name【长度20个字符】
create table a
(
id  INT,
NAME VARCHAR(20)
);
jar包准备
引⼊依赖【不知道什么是依赖的可查看】
<dependencies>
<!--数据库连接依赖引⼊-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.49</version>
</dependency>
<!--单元测试依赖引⼊-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
⽅式⼀:普通插⼊
* 普通批量插⼊,直接将插⼊语句执⾏多次即可
*/
@Test
public void bulkSubmissionTest1() {
long start = System.currentTimeMillis();//开始计时【单位:毫秒】
Connection conn = Connection();//获取数据库连接
String sql = "insert into a(id, name) VALUES (?,null)";
PreparedStatement ps = null;
try {
ps = conn.prepareStatement(sql);
for (int i = 1; i <= 1000000; i++) {
ps.setObject(1, i);//填充sql语句种得占位符
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
jdbcUtils.close(conn, ps, null);
}
//打印耗时【单位:毫秒】
System.out.println("百万条数据插⼊⽤时:" + (System.currentTimeMillis() - start)+"【单位:毫秒】");    }
⽤时:62分钟多
数据库插⼊结果
⽅式⼆:使⽤批处理插⼊
* 在⽅式⼀的基础上使⽤批处理
* 使⽤PreparedStatement ps;的
*      ps.addBatch();      将sql语句打包到⼀个容器中
*      ps.executeBatch();  将容器中的sql语句提交
*      ps.clearBatch();    清空容器,为下⼀次打包做准备
* 这三个⽅法实现sql语句打包,累计到⼀定数量⼀次提交
*/
@Test
public void bulkSubmissionTest2() {
long start = System.currentTimeMillis();
Connection conn = Connection();//获取数据库连接
String sql = "insert into a(id, name) VALUES (?,null)";
PreparedStatement ps = null;
try {
ps = conn.prepareStatement(sql);
for (int i = 1; i <= 1000000; i++) {
ps.setObject(1, i);
ps.addBatch();//将sql语句打包到⼀个容器中
if (i % 500 == 0) {
ps.clearBatch();//清空容器,为下⼀次打包做准备
}
}
//为防⽌有sql语句漏提交【如i结束时%500!=0的情况】,需再次提交sql语句
ps.clearBatch();//清空容器
} catch (SQLException e) {
e.printStackTrace();
} finally {
jdbcUtils.close(conn, ps, null);
}
System.out.println("百万条数据插⼊⽤时:" + (System.currentTimeMillis() - start)+"【单位:毫秒】");
}
⽤时
数据库插⼊结果
⽅式⼀、⼆总结:到此可以看出其实其处理程序是没有起作⽤的,为此我们使⽤⽅式三
⽅式三:通过连接配置url设置【&rewriteBatchedStatements=true】
(设置重写批处理语句)
⽅式三核⼼语法:【底层就是使⽤sql⾃带的语法,(⼀般插⼊value建议⽤于多个⾏数据的插⼊,values建议⽤于单⾏数据插⼊,这样效率可以;
来⾃⼤佬的测试:)】
insert into a(id, NAME)
VALUE (1, '张三'),
(2, '李四'),
(3, '王⼆'),
(4, '刘备'),
(5, '曹操'),
(6,'张飞');
url=jdbc:mysql://localhost:3306/test01?characterEncoding=utf8&serverTimezone=UTC&useSSL=false&rewriteBatchedStatements=true
/**
* ⽅式三
* 在⽅式⼆的基础上允许重写批量提交语句,获取连接的url需加上
* 【&rewriteBatchedStatements=true】(重写批处理语句=是)
*/
@Test
public void bulkSubmissionTest3() {
long start = System.currentTimeMillis();
Connection conn = Connection();//获取数据库连接
String sql = "insert into a(id, name) VALUES (?,null)";
PreparedStatement ps = null;
try {
ps = conn.prepareStatement(sql);
批量更新sql语句
for (int i = 1; i <= 1000000; i++) {
ps.setObject(1, i);
ps.addBatch();
if (i % 500 == 0) {
ps.clearBatch();
}
}
ps.clearBatch();
} catch (SQLException e) {
e.printStackTrace();
} finally {
jdbcUtils.close(conn, ps, null);
}
System.out.println("百万条数据插⼊⽤时:" + (System.currentTimeMillis() - start)+"【单位:毫秒】");
}
⽤时:【10秒左右】
数据库插⼊结果
到此批处理语句才正是⽣效
注意
数据库连接的url设置了【&rewriteBatchedStatements=true】时,java代码种的sql语句不能有分号【;】号,否则批处理语句打包就会出现错误,导致后⾯的sql语句提交出现【BatchUpdateException】异常
异常:【BatchUpdateException】(批量更新异常)
⽅式四:通过数据库连接取消⾃动提交,⼿动提交数据

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。