1.啥是JDBC的批处理:相对不是批处理操作而言,批处理操作效率更高了。
小故事:之前学生放学坐班车回家,假设而这个学校有1000名学生,每次班车?每次送一个学生,需要往返1000次才能完全送完
现在学生放学坐班车回家,假设而这个学校有1000名学生,每次班车?送100个学生,只需要往返10次就能送完
结论:相比之前效率提高了100倍 我的天那 是不是很厉害的样子
1.JDBC的处理批处理的两个方法
addBatch(String)//添加需要批处理的SQL或者参数
eexcuteBatch()//开始执行批处理操作
2.两种批处理SQL语句操作
2.1 静态SQL--Statement 存储引擎:(InnoDB: MyISAM)
多条静态SQL语句的批量处理:Statement //多条不同的sql 同时执行
加载驱动
获取连接对象
state=conn.createStatement();//获取语句对象
for(int i=0; i<10000; i++){
String sql;//SQL语句是不变的
state.addBatch(sql);//往内存中批量添加所有的SQL--往袋子装 撞满为止
if(i%200==0){//袋子中只能装200个 --袋子装满了 批量执行一次
state.ceexcuteBatch();//执行所有的SQL--把袋子中的sql执行完。
state.ClearBach()//清除批量操作的缓存
}
}
最后释放资源
结论:1.执行静态SQL 相对mysql数据库 MyISAM的存储时间比不使用批处理的进行插入数据的时间要长
2.执行静态SQL 相对mysql数据库 InnoDB的存储时间比不使用批处理的进行插入数据的时间几乎一致
3. 执行静态SQL 相对mysql数据库 MyISAM执行SQL的时间要比 InnoDB的时间要少很多
2.2 动态SQL--prepareStatement 存储引擎:(InnoDB: MyISAM)
一条SQL语句的批量传参处理:PrepareStatement //sql的模版完全相同,不同在于sql的参数,插入一千条数据 每天数据的参数是不一样的
加载驱动
获取连接对象
PeraperState=conn.createStatement();//获取语句对象
String sql(?,?);//SQL语句中的参数是变化的
for(int i=0; i<10000; i++){
//设置参数
PeraperState,setString(1,"abc");
PeraperState.setLong(2,i);
PeraperState.addBatch();//添加进入批处理
if(i%200==0){//每进入200个 批量执行一次
state.ceexcuteBatch(sql);//执行所有加进来的SQL
state.ClearBach()//清除批量操作的缓存
}
}
最后释放资源
结论:1.执行静态SQL 相对mysql数据库 MyISAM的存储时间比不使用批处理的进行插入数据的时间要长
2.执行静态SQL 相对mysql数据库 InnoDB的存储时间比不使用批处理的进行插入数据的时间几乎一致
3. 执行静态SQL 相对mysql数据库 MyISAM执行SQL的时间要比 InnoDB的时间要少很多
种种现象表明 mysql不支持 批量处理 很无奈 貌似很高大上的API 到头来 有种费力不讨好的感觉 欲哭无泪
但是可以通过配置驱动的方式让mysql 支持批处理操作 但是只对动态SQL有效 --prepareStatement
在JDBC配置文件中的添加一个参数 URL=jdbc:mysql://localhost:3306/jdbc?rewriteBatchedStatements=true