开发者学堂课程【JDBC数据库开发入门:批处理】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/29
批处理
内容简介
一、批处理的概念
二、批处理的运行
一、批处理的概念
批处理的概念就是一批一批的处理,原先处理数据库是一条一条的处理,发送一条语句过去,服务器执行一条。发一条执行一条对网络的传输来说过于频繁,往返的次数过多会影响效率,所以这时考虑到批处理,也就是客户端能不能一批一批的把sq语句运送到服务器,然后服务器一批一批的执行,所谓批可以理解成集合。
批处理有两种形式,一种是用Statement来完成,另一种是用PreparedStatement来完成,第一种不再介绍。现在主要介绍第二种PreparedStatement。
二、批处理的运行
如何做到一批一批的往外传送呢?
1.新创建一个Demo5。
首先介绍批处理。psrmt对象内部有集合,有集合可以理解为有批。
(1)用循环疯狂向pstmt中添加sql参数,它自己有模板,使用一组参数与模板没罚可以匹配出一条sql语句。
(2)调用它的执行批方法,完成向数据库发送!
2.实验
现在至少需要两个方法给我们提供,也就是说pstmt需要提供两个方法
(1) 添加参数到批中,
(2)执行批!复制三条代码:
Connection con=JdbcUtils.getConnection();
String sql="select from tab_bin";
PreparedStatement pstmt=con.prepareStatement(sql);
更改模板,用以下的表做实验:
清除数据 delete from t_stu ,接下来插入"INSERT INTO t_stu VALUES(?,?,?,?)"
3.疯狂的添加参数
设置参数for(int i=0;i<10000;i++),一万行记录需要往数据库里插。
第一个参数:pstmt.setInt(1,i+1);第一个是int类型
第二个参数:pstmt.setString(2,“stu_”+i);这就是stu0,stu1……
第三个参数:年龄,pstmt.setInt(3,i);第一个人0岁,最后一个人9999岁。
第四个参数:性别,pstmt.setString (4,i&2==0?“男”:“女”);
这些参数给完了思考一个问题:
现在是执行还是怎样?循环回来是否要把参数覆盖掉?
要记住:不要把参数扔了,循环回来还是一个参数,又重复了,所以有一个非常重要的代码:pstmt.addBatch();添加批,这一组参数就保存到集合中了。
然后循环回来又设置一组参数,又添加进去了,到现在为止循环完还未执行,所以最后的代码就是:pstmt. execteBatch(); 执行批
代码写完了,一共用了两个方法,一个是添加批,一个是执行批。
执行批更加耽误时间。添加批是发送。添加批内部有集合,执行批则是把集合一起发送。添加批相当于装车,而执行批相当于发车。
这时,需要记录时间:long start=System.currentTimeMillis();
long end=System.currentTimeMillis();
最后输出System.out.println(end-start);代码写完了。
如图:
4.测试
测试一下:select count(*) FROM t_stu;耐心等待,可以比较出来批处理到底快不快。这时的批处理较慢,是因为MySQL默认批处理是封闭的,打开它需要一个参数rewriteBatchedStatements=true把参数配到url处加一问号打开 然后保存,等这一遍执行完了,再来执行第二遍。一个是使用批处理的效果,一个不使用批处理的效果。当前数据库不支持批处理,只有把参数加上才能比较出来批处理到底快不快。
注意:Mysql不支持批处理是因为缺少变量,参数rewriteBatchedStatements=true一定要加在url后面,前面一定要加问号。Mysql是支持批处理的,代码一定要有变量。
一万条大概执行六分钟。算一下时间,用了412764毫秒,除以1000,得到秒,除以60,得到6.8794分钟。
输入代码:System.out.println(end-start)// 412764,6.8794分钟。
由于前面重复组建了,所以执行之前先清除数据库,输入:DELETE FROM t_stu,使一万行消失,得到0行。右键执行,得到520毫秒。一秒钟都用不上。以上是二者的区别,再次删掉执行,301毫秒。
这就是批处理的作用。