写了几段测试程序,测试一下mysql的性能.简单说下环境,tomcat下使用连接池连接的mysql,测试方式以下3种:
1:每次从连接池获得一个连接执行一个固定的insert语句2000次:
insert into test (testcol,testcol1,testcol2,testcol3,testcol4,testcol5,testcol6,testcol7)
values('aaaaaaa','aaaaaaa','aaaaaaa','aaaaaaa','aaaaaaa','aaaaaaa','aaaaaaa','aaaaaaa')
每次执行后连接关闭.
2:每次从连接池获得一个连接执行一个预编译的insert语句2000次:
insert into test (testcol,testcol1,testcol2,testcol3,testcol4,testcol5,testcol6,testcol7)
values(?,?,?,?,?,?,?,?)
每次执行后连接关闭.
3:从连接池中取一个连接,执行一个预编译的insert语句2000次:
insert into test (testcol,testcol1,testcol2,testcol3,testcol4,testcol5,testcol6,testcol7)
values(?,?,?,?,?,?,?,?)
2000条语句执行完毕,关闭该连接
4:从连接池中获得一个连接,设置预编译语句:
insert into test (testcol,testcol1,testcol2,testcol3,testcol4,testcol5,testcol6,testcol7)
values(?,?,?,?,?,?,?,?)
2000次循环,每次设置完参数后执行addBatch.最后执行excuteBatch();
测试结果如下:
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 平均值 | |
方式1: | 4439 | 6777 | 4727 | 6468 | 6258 | 9719 | 10270 | 4525 | 7763 | 8736 | 6968.2 |
方式2: | 5448 | 5214 | 4794 | 4905 | 6212 | 6924 | 6131 | 7287 | 6879 | 7128 | 6092.2 |
方式3: | 4906 | 6296 | 5835 | 4592 | 4686 | 7431 | 4664 | 5777 | 8029 | 4572 | 5678.8 |
方式4: | 4830 | 5895 | 5685 | 5126 | 5586 | 4932 | 5250 | 5862 | 5976 | 5589 | 5473.1 |
可以看出来,直接传递sql语句的方式最慢达到了6968毫秒.
第3\4种方式差别不太多.主要是我的程序和数据库在同一台机器上.excuteUpdate()每执行一次数据就会在网络上往返传输一次数据,执行2000次就会往返2000次.但使用了excuteBatch(),数据在网络上只往返了1次.所以当多次执行同一个sql时最适合使用excuteBatch()方式.例如,服务器向数据库中写日志,可以采用积累一定的日志信息后,定时采用excuteBatch()传送到服务器