批处理
Posted 康星悦
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了批处理相关的知识,希望对你有一定的参考价值。
批处理(batch)------------>好比快递员【不能一件一件的送快递】
- 批处理指的是一次操作中执行多条SQL语句
- 批处理相比于一次一次执行效率会提高很多
- 批处理主要是分两步:
1.将要执行的SQL语句保存
2.执行SQL语句
- Statement和PreparedStatement都支持批处理操作,此处以PreparedStatement的批处理方式为例:
- 方法:
void addBatch()
- 将要执行的SQL先保存起来,先不执行
- 这个方法在设置完所有的占位符之后调用
int[] executeBatch()
- 这个方法用来执行SQL语句,这个方法会将批处理中所有SQL语句执行
- mysql默认批处理是关闭的,所以我们还需要去打开mysql的批处理:
rewriteBatchedStatements=true
我们需要将以上的参数添加到mysql的url地址中
- 注意:低版本的mysql-jdbc驱动也不支持批处理,一般都是在修改的时候使用批处理,查询的时候不使用!
案例演示:
1.创建一张新的数据表
CREATE TABLE t_emp(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(50)
)
2.反复打开数据库客户端,插入语句【相当于每次获取一个connection连接,执行executeUpdate语句】
INSERT INTO t_emp(NAME) VALUES(‘张三‘);
SELECT * FROM t_emp;
TRUNCATE TABLE emp_batch;//清空表
SELECT COUNT(*) FROM emp_batch;//统计插入数
3.引出批处理--->执行效率高,资源利用率好!
1 public class JDBCUtil { 2 private static String username="root"; 3 private static String password="123456"; 4 //添加问号?后参数,打开mysql批处理 5 private static String url="jdbc:mysql://localhost:3306/student?rewriteBatchedStatements=true"; 6 private static String driver="com.mysql.jdbc.Driver"; 7 8 private static Connection conn=null; 9 static{ 10 try { 11 Class.forName(driver); 12 } catch (ClassNotFoundException e) { 13 e.printStackTrace(); 14 } 15 } 16 public static Connection getConnection(){ 17 try { 18 conn = DriverManager.getConnection(url, username, password); 19 return conn; 20 } catch (SQLException e) { 21 return null; 22 } 23 } 24 25 public static void close(Connection conn,PreparedStatement ps){ 26 if(conn!=null){ 27 try { 28 conn.close(); 29 } catch (SQLException e) { 30 // TODO Auto-generated catch block 31 e.printStackTrace(); 32 } 33 } 34 if(ps!=null){ 35 try { 36 ps.close(); 37 } catch (SQLException e) { 38 // TODO Auto-generated catch block 39 e.printStackTrace(); 40 } 41 } 42 } 43 }
1 @Test//测试批处理 2 public void testBatch(){ 3 //向t_emp表中插入10000条数据 4 5 //准备两个变量 6 Connection connection = null; 7 PreparedStatement ps = null; 8 9 try { 10 //获取数据库连接 11 connection=JDBCUtil.getConnection(); 12 //准备SQL模板 13 String sql = "INSERT INTO t_emp(NAME) VALUES(?)"; 14 //获取PrepareStatement 15 ps = connection.prepareStatement(sql); 16 //创建一个for循环,来设置占位符 17 for(int i = 0; i < 10000 ;i++){ 18 //填充占位符 19 ps.setString(1,"emp"+i); 20 //添加到批处理方法中,调用无参的,有参的是Statement来调用的! 21 ps.addBatch(); 22 } 23 24 //获取一个时间戳 25 long start = System.currentTimeMillis(); 26 //执行批处理 27 ps.executeBatch(); 28 //获取一个时间戳 29 long end = System.currentTimeMillis(); 30 System.out.println("共花费了:"+(end-start)); 31 } catch (SQLException e) { 32 e.printStackTrace(); 33 } 34 }
注意:将批处理加入到事务中时,批处理的效率会更高
以上是关于批处理的主要内容,如果未能解决你的问题,请参考以下文章
你如何在 python 中处理 graphql 查询和片段?
是否有在单个活动中处理多个片段的 Android 设计模式?