PreparedStatement.executeBatch()效率低的问题
下面是我的方法,我的数据量大概有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");
executeBatch addBatch commit --------------------编程问答-------------------- 什么数据库,mysql的话。你不用研究了。看看官方文档 --------------------编程问答-------------------- 1. 直接用SQL客户端执行相应的SQL脚本, 所用的时间和用java程序写的比较如何? 如果差不多, 那么就不是程序的问题了, 要到数据库服务器上找原因 (索引, 触发器, ...)
2. 你这个事务是不是太大了? 代码中只有一个事务. 我的经验是, 每10-100条作为一个事务commit, 会比每条一个事务commit或>1000条一个事务commit, 总体执行时间要短. 当然前提是可以分成多个事务.
--------------------编程问答-------------------- oracle数据库 --------------------编程问答-------------------- 我就怕是数据库的原因,数据库的管理维护不是很精通 --------------------编程问答-------------------- 帮顶啊,实在是不会了 --------------------编程问答-------------------- 我也正巧再做这样的项目,应该是索引失效了,插入数据中,删除再重建 或者直接删除和重建。希望对你有帮助 --------------------编程问答-------------------- 哪里效率低了,我用pStatement.executeBatch插入数据库1w条也是几十秒 --------------------编程问答-------------------- Oracle 的写入效率跟你Commit不Commit一点儿关系没有。。。
建议你看看Oracle的写入机制,查查DBWn,CKPT 进程。
更新效率慢有各种各样的原因,其实归结到最后都是IO效率低下,建议你收集一下Oracle 的AWR,然后再说。 --------------------编程问答-------------------- 把程序和Oracle同机部署,先排除网络原因
然后检查表的定义,是否有索引啊、触发器啊之类的东东,全部去掉,重新测试
调整SQL,增加append的hint看看,速度有没有提升,目标表有可能频繁做过删除和插入操作,可以考虑作下重组
最后,如果速度还是没有提升,可以考虑监控磁盘IO了
最后的最后,换个机器尝试
实在不行,换个Oracle的版本、换硬件 --------------------编程问答-------------------- 还有一点,检查一下驱动的版本,配套1.6版本的驱动在单事务中支持大数据量的提交,不过和性能提升没有必然的关系,但新版本在性能方面总是有优化的,所以可以大胆的尝试 --------------------编程问答-------------------- 我感觉3000多条本机循环插入也不需要4分钟以上吧,更不用说使用批量提交了...你的电脑是小霸王还是怎么的?感觉是你的表限制太多了吧,检查下你的表结构设计,如果里面的限制太多建议来个临时表然后让他慢慢copy过去... --------------------编程问答-------------------- 我的200w数据,以1000条向Oracle中executeBatch提交一次,采用了不到30秒。 --------------------编程问答-------------------- 没看到你的代码做了3000条提交一次的处理 --------------------编程问答-------------------- 发SQL语句上来看看 --------------------编程问答-------------------- 用存储过程在数据库中测试下 --------------------编程问答-------------------- 用存储过程吧 --------------------编程问答-------------------- 现在的代码是一次全提
补充:Java , Java SE