0
点赞
收藏
分享

微信扫一扫

JDBC-07- 批量执行SQL语句


批量插入

文章目录

  • ​​批量插入​​
  • ​​批量执行SQL语句​​
  • ​​JDBC的批量处理语句包括下面三个方法:​​
  • ​​通常我们会遇到两种批量执行SQL语句的情况​​
  • ​​高效的批量插入​​
  • ​​层次一:使用Statement实现​​
  • ​​层次二:使用PreparedStatement​​
  • ​​层次三: 使用addBatch()、executeBatch()、clearBatch()​​
  • ​​层次四:设置连接不允许自动提交数据​​

批量执行SQL语句

当需要成批执行插入或者更新记录时,可以采用java的批量更新机制,这一机制允许多条语句一次性提交给数据库批量处理。通常情况下比单独提交处理更有效率

JDBC的批量处理语句包括下面三个方法:

  • addBatch(String): 添加需要批量处理的SQL语句或是参数
  • executeBath(): 执行批量处理语句
  • clearBath(); 清空缓存的数据

通常我们会遇到两种批量执行SQL语句的情况

  • 多条SQL语句的批处理
  • 一条SQL语句的批传参

高效的批量插入

层次一:使用Statement实现

* Connection conn = JDBCUtils.getConnection();
* Statement st = conn.createStatement();
* for(int i = 1;i <= 20000;i++){
* String sql = "insert into goods(name)values('name_" + i + "')";
* st.execute(sql);
* }

层次二:使用PreparedStatement

long start = System.currentTimeMillis();

Connection conn = JDBCUtils.getConnection();

String sql = "insert into goods(name)values(?)";
PreparedStatement ps = conn.prepareStatement(sql);
for(int i = 1;i <= 20000;i++){
ps.setString(1, "name_" + i);
ps.executeUpdate();
}

long end = System.currentTimeMillis();
System.out.println("花费的时间为:" + (end - start));//82340


JDBCUtils.closeResource(conn, ps);

层次三: 使用addBatch()、executeBatch()、clearBatch()

1.addBatch()、executeBatch()、clearBatch()
2.mysql服务器默认是关闭批处理的,我们需要通过一个参数,让mysql开启批处理的支持。?rewriteBatchedStatements=true 写在配置文件的url后面
3.使用更新的mysql 驱动:mysql-connector-java-5.1.37-bin.jar

@Test
public void testInsert1() throws Exception{
long start = System.currentTimeMillis();

Connection conn = JDBCUtils.getConnection();

String sql = "insert into goods(name)values(?)";
PreparedStatement ps = conn.prepareStatement(sql);

for(int i = 1;i <= 1000000;i++){
ps.setString(1, "name_" + i);

//1.“攒”sql
ps.addBatch();
if(i % 500 == 0){
//2.执行
ps.executeBatch();
//3.清空
ps.clearBatch();
}
}

long end = System.currentTimeMillis();
System.out.println("花费的时间为:" + (end - start));//20000条:625 //1000000条:14733

JDBCUtils.closeResource(conn, ps);
}

层次四:设置连接不允许自动提交数据

设置不允许自动提交数据conn.setAutoCommit(false);
提交数据 conn.commit();

@Test
public void testInsert3() {
Connection conn = null;
PreparedStatement ps = null;
try {

long start = System.currentTimeMillis();

conn = JDBCUtils.getConnection();

//设置不允许自动提交数据
conn.setAutoCommit(false);

String sql = "insert into goods(name)values(?)";
ps = conn.prepareStatement(sql);
for(int i = 1;i <= 1000000;i++){
ps.setObject(1, "name_" + i);

//1."攒"sql
ps.addBatch();

if(i % 500 == 0){
//2.执行batch
ps.executeBatch();

//3.清空batch
ps.clearBatch();
}
}
//提交数据
conn.commit();

long end = System.currentTimeMillis();

System.out.println("花费的时间为:" + (end - start)); //20000:83065 -- 565
} catch (Exception e) { //1000000:16086 -- 5114
e.printStackTrace();
}finally{
JDBCUtils.closeResource(conn, ps);

}

}

JDBC-07- 批量执行SQL语句_数据库

JDBC-07- 批量执行SQL语句_mysql_02


举报

相关推荐

0 条评论