为什么JDBC做批量更新速度很慢? 程序没问题,建议如下:1、将batch数改大,改成1000试试2、给planid字段和phonenum字段建索引 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 if( i % 60 == 0){ //每60条打包发送 // ps.executeBatch(); } } ps.executeBatch(); -------------------------------------if( i % 60 == 0){ //每60条打包发送 ps.executeBatch(); } } //ps.executeBatch(); 没有进行批处理啊,都是一条条的处理 还有在for循环外要加一句刷新:ps.executeBatch(); 之前发贴时忘记把注释取消了。是:if( i % 60 == 0){ //每60条打包发送 ps.executeBatch(); } } ps.executeBatch(); 也就是60条打包。速度奇慢 第一 建议在ps.addBatch();后添加ps.clearParameters();第二 我PreparedStatement对象在执行过ps.executeBatch();之后会清空批量池里的语句么?如果不会那conn.commit();前的那句ps.executeBatch(); 其实相当于又把所有语句执行了一遍(因为之前的还都在里面都没施放)建议这样if( i % 60 == 0){ //每60条打包发送 ps.executeBatch(); ps.clearBatch(); }试下也许能有用 感觉不加ps.clearBatch();的话 如果有130条要更新if( i % 60 == 0){ //每60条打包发送 ps.executeBatch();}那到第60条记录的时候是更新了第1条至60条记录 而到第120条记录的时候是更新了第1条至第120条而之后的 ps.executeBatch(); //这句其实是更新了第1条至第130条conn.commit(); 看出问题了么?重复更新了很多次 当然这只是我个人感觉不一定全对 你再仔细思考一下 感觉不加ps.clearBatch();的话 如果有130条要更新if(i%60 == 0){ //每60条打包发送 ps.executeBatch();}那到第60条记录的时候if第一次成立批量更新了第1条至60条记录 而到第120条记录的时候if第二次成立更新了第1条至第120条 并不是61至120条而之后的 ps.executeBatch(); //这句其实是更新了第1条至第130条 并不是121至130条conn.commit(); 看出问题了么?重复更新了很多次 肯定会很慢 当然这只是我个人感觉不一定全对 你再仔细思考一下第一 建议在ps.addBatch();后添加ps.clearParameters();第二 建议这样if(i%60 == 0){ //每60条打包发送 ps.executeBatch(); ps.clearBatch();} 好。非常谢谢你的详细解答。最后这个语句ps.executeBatch();不加也行。因为commit时它会执行。主要问题在小循环中。就是每60条更新时速度比较慢。因为我在if( i%60 == 0)就打印语句。每更新60条提示一次。感觉很慢。1-60条时也不快。如果按照你所说的。1-60理应是最快的。然后依次变慢。但现在情况不是这样。我的思路是这样的。应为更新数量比较多。所以每次我都把sql语句都先添加等累计到一定数量如每60条就执行,主要的代码如下:ps = conn.prepareStatement(sql); for(int i = 0;i <list.size();i++){ ps.setInt(1,0L); ps.setLong(2,phonenum); ps.addBatch(); if( i % 60 == 0){ //每60条打包发送 ps.executeBatch(); } } ps.executeBatch(); conn.commit();这个思路,跟代码是否有错误?如果没,那为什么执行速度慢? 这个怎么说好呢 你感觉怎么样才算达到你的要求感觉不慢呢?可能用JDBC的话也就只能这样了 毕竟没法和直接在服务器的数据库上运行相比我个人感觉如果只有60条的话这程序应该是没问题 只是那句SQL里的planid='"+planid+"' 也可以换成planid=?然后将也在下面用ps.setString(2,planid);就行 其实你在程序里已经写了 但我不明白为什么要注释掉 而且如果是主贴那样写的话ps.setLong(3,phonenum);也应该是ps.setLong(2,phonenum);才对我还是建议在if里加上ps.clearBatch();这句试一下 最起码这样写对于大于60条的更新应该是有好处的 求思路,JAVA文件格式转换 一个关于方法的继承的简单问题 关于字符在计算机内部的表示 一个SQL问题 很蹊跷 一个连接SQL库问题,大家请帮忙! 请问java中Tab值怎么表示?谢谢! 在哪儿能找到Java虚拟机的选项手册?(-xx的) jsp程序在移直到LINUX上后出现乱码情况? 准备开发一个新的项目:类似资源管理器的功能,且是组件的方式,请各位大侠多提意见 哪位有讨论java的新闻组介绍一下,说出一个给50,不够加 求助,SWT中的Composite面板如何滚动 关于private方法重写
//每60条打包发送
// ps.executeBatch();
}
}
ps.executeBatch(); -------------------------------------
if( i % 60 == 0){
//每60条打包发送
ps.executeBatch();
}
}
//ps.executeBatch(); 没有进行批处理啊,都是一条条的处理
ps.executeBatch();
是:
if( i % 60 == 0){
//每60条打包发送
ps.executeBatch();
}
}
ps.executeBatch();
也就是60条打包。速度奇慢
第二 我PreparedStatement对象在执行过ps.executeBatch();之后会清空批量池里的语句么?如果不会那conn.commit();前的那句ps.executeBatch(); 其实相当于又把所有语句执行了一遍(因为之前的还都在里面都没施放)
建议这样
if( i % 60 == 0){
//每60条打包发送
ps.executeBatch();
ps.clearBatch();
}
试下也许能有用
if( i % 60 == 0){
//每60条打包发送
ps.executeBatch();
}
那到第60条记录的时候是更新了第1条至60条记录 而到第120条记录的时候是更新了第1条至第120条
而之后的
ps.executeBatch(); //这句其实是更新了第1条至第130条
conn.commit();
看出问题了么?重复更新了很多次 当然这只是我个人感觉不一定全对 你再仔细思考一下
if(i%60 == 0){
//每60条打包发送
ps.executeBatch();
}
那到第60条记录的时候if第一次成立批量更新了第1条至60条记录
而到第120条记录的时候if第二次成立更新了第1条至第120条 并不是61至120条
而之后的
ps.executeBatch(); //这句其实是更新了第1条至第130条 并不是121至130条
conn.commit();
看出问题了么?重复更新了很多次 肯定会很慢 当然这只是我个人感觉不一定全对 你再仔细思考一下第一 建议在ps.addBatch();后添加ps.clearParameters();
第二 建议这样
if(i%60 == 0){
//每60条打包发送
ps.executeBatch();
ps.clearBatch();
}
最后这个语句ps.executeBatch();不加也行。因为commit时它会执行。
主要问题在小循环中。就是每60条更新时速度比较慢。
因为我在if( i%60 == 0)就打印语句。每更新60条提示一次。感觉很慢。1-60条时也不快。
如果按照你所说的。1-60理应是最快的。然后依次变慢。但现在情况不是这样。
我的思路是这样的。应为更新数量比较多。所以每次我都把sql语句都先添加等累计到一定数量
如每60条就执行,主要的代码如下:ps = conn.prepareStatement(sql);
for(int i = 0;i <list.size();i++){
ps.setInt(1,0L);
ps.setLong(2,phonenum);
ps.addBatch(); if( i % 60 == 0){
//每60条打包发送
ps.executeBatch();
}
}
ps.executeBatch();
conn.commit();这个思路,跟代码是否有错误?如果没,那为什么执行速度慢?
我个人感觉如果只有60条的话这程序应该是没问题 只是那句SQL里的planid='"+planid+"' 也可以换成planid=?然后将也在下面用ps.setString(2,planid);就行 其实你在程序里已经写了 但我不明白为什么要注释掉 而且如果是主贴那样写的话ps.setLong(3,phonenum);也应该是ps.setLong(2,phonenum);才对
我还是建议在if里加上ps.clearBatch();这句试一下 最起码这样写对于大于60条的更新应该是有好处的