PreparedStatement.executeBatch()效率低的问题

hui_play 2013-04-23 08:48:30
下面是我的方法,我的数据量大概有10w条左右,sql语句是简单的更新语句,我每3000条做一次提交(在调用本方法的方法中实现的),3000条数据需要4分多钟,这还是要本机数据库,如果是服务器数据库的话时间回达到10几分钟,有的时候会达到40分钟,我尝试给换成每1000条提交和每1条提交,时间几乎差不多(本机),服务器未测试,所以我想知道为什么会出现这样的问题,群里有人告诉我说他的700w数据才2分钟,不知道真假。但是现在这个效率直接影响到我的其他业务了,请各位大侠协助解决下,出出注意,不盛感激。
conn.setAutoCommit(false);//开始事务
ChangeDay cd = new ChangeDay();
String sql = cd.updateDay();
ps = conn.prepareStatement(sql);
Iterator<Bankaccount> it = list.iterator();
int i=0;
while(it.hasNext())
{
//System.out.println(i);
Bankaccount bc = (Bankaccount)it.next();
ps.setFloat(1, bc.getTheMoney());
ps.setString(2, bc.getBankaccount());
ps.addBatch();
i++;

}
//System.out.println("111111111");
ps.executeBatch();//此处特别慢
//System.out.println("222222222");
conn.commit();//提交事务
//System.out.println("33333333333");
ps.clearBatch();
//System.out.println("444444444");
...全文
1703 点赞 收藏 21
写回复
21 条回复
wula0010 2015年02月05日
你的sql的问题,或者表的索引,是否优化,10万条数据是毛毛雨了...............
回复 点赞
lingyun304 2015年02月05日
sql没贴出来啊,只有插入语句的会很快,否则就是网络问题。 如果是更新语句的话,就是数据量大,而查询字段缺少索引或数据类型不一致导致没走索引。
回复 点赞
北落师门_Orz 2014年10月19日
我听我朋友遇到过这种问题,他的问题没有删除索引,所以效率是越来越低 ,删除所有索引试试
回复 点赞
sozhangye 2014年10月19日
stmt.addBatch(); if (i % 1000 == 0) { // 每一千条刷新并写入数据库 stmt.executeBatch(); conn.commit(); // 清空stmt中积攒的sql stmt.clearBatch(); i=0; } 这样写试试
回复 点赞
sunbo624 2013年11月28日
现在的代码是一次全提
回复 点赞
快乐的2 2013年11月27日
发SQL语句上来看看
回复 点赞
steely_chen 2013年11月27日
没看到你的代码做了3000条提交一次的处理
回复 点赞
MicroKingwxy 2013年11月27日
我的200w数据,以1000条向Oracle中executeBatch提交一次,采用了不到30秒。
回复 点赞
狂热的土豆 2013年11月27日
用存储过程吧
回复 点赞
wuer0520 2013年11月27日
用存储过程在数据库中测试下
回复 点赞
小丑哥_V5 2013年08月24日
我感觉3000多条本机循环插入也不需要4分钟以上吧,更不用说使用批量提交了...你的电脑是小霸王还是怎么的?感觉是你的表限制太多了吧,检查下你的表结构设计,如果里面的限制太多建议来个临时表然后让他慢慢copy过去...
回复 点赞
小南家的青蛙 2013年08月23日
还有一点,检查一下驱动的版本,配套1.6版本的驱动在单事务中支持大数据量的提交,不过和性能提升没有必然的关系,但新版本在性能方面总是有优化的,所以可以大胆的尝试
回复 点赞
小南家的青蛙 2013年08月23日
把程序和Oracle同机部署,先排除网络原因 然后检查表的定义,是否有索引啊、触发器啊之类的东东,全部去掉,重新测试 调整SQL,增加append的hint看看,速度有没有提升,目标表有可能频繁做过删除和插入操作,可以考虑作下重组 最后,如果速度还是没有提升,可以考虑监控磁盘IO了 最后的最后,换个机器尝试 实在不行,换个Oracle的版本、换硬件
回复 点赞
积木 2013年08月23日
Oracle 的写入效率跟你Commit不Commit一点儿关系没有。。。 建议你看看Oracle的写入机制,查查DBWn,CKPT 进程。 更新效率慢有各种各样的原因,其实归结到最后都是IO效率低下,建议你收集一下Oracle 的AWR,然后再说。
回复 点赞
流智 2013年08月23日
哪里效率低了,我用pStatement.executeBatch插入数据库1w条也是几十秒
回复 点赞
jay881101 2013年06月25日
我也正巧再做这样的项目,应该是索引失效了,插入数据中,删除再重建 或者直接删除和重建。希望对你有帮助
回复 点赞
hui_play 2013年04月23日
我就怕是数据库的原因,数据库的管理维护不是很精通
回复 点赞
hui_play 2013年04月23日
oracle数据库
回复 点赞
caili314 2013年04月23日
1. 直接用SQL客户端执行相应的SQL脚本, 所用的时间和用java程序写的比较如何? 如果差不多, 那么就不是程序的问题了, 要到数据库服务器上找原因 (索引, 触发器, ...) 2. 你这个事务是不是太大了? 代码中只有一个事务. 我的经验是, 每10-100条作为一个事务commit, 会比每条一个事务commit或>1000条一个事务commit, 总体执行时间要短. 当然前提是可以分成多个事务.
回复 点赞
十年彩虹 2013年04月23日
什么数据库,mysql的话。你不用研究了。看看官方文档
回复 点赞
发动态
发帖子
Java SE
创建于2007-09-28

3.4w+

社区成员

30.7w+

社区内容

Java 2 Standard Edition
社区公告
暂无公告