for循环执行速度越来越慢

clon_forever 2016-07-29 02:16:46


wirelayingList 里添加了140万个对象,要分批次将对象存入数据库中。

开始时外层循环一次花时很短,随着程序的运行,速度越来越慢,到后面一次循环之后要等近一分钟才执行,求解啊。
...全文
3324 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
flyingzm 2017-02-10
  • 打赏
  • 举报
回复
经检查还是属于泄漏,申请的ArrayList容量越来越大的原因,虽然每个循环用完之后是释放掉的。看来还是代码的问题。
flyingzm 2017-02-10
  • 打赏
  • 举报
回复
我也有相同的疑问,不管循环里面做的是什么,是读数据库,还是多线程,还是正常循环,头几遍跑时,速度还是很快的,接着速度就会越来越慢,用System.gc(); 也没用。CPU的占用则会越来越高,内存占用倒是不大,也不会自动增加,应该排除内存泄漏的原因。就是CPU占用,循环的前几次还很小,运行十几分钟就越来越大,直到把CPU全占光,到最后几次循环,每一次时间都巨长无比,其实每次循环里做的工作强度是一样的。楼主最终这个问题解决了吗?
  • 打赏
  • 举报
回复
引用 3 楼 clon_forever 的回复:
[quote=引用 1 楼 qq646222123 的回复:] 你的具体需求虽然我不知道,但是一般循环套循环 , 循环内还要数据操作的 , 数据量小了到看不出来什么来 , 数据量大了就不行 , 一个请求需要双层迭代 , 单线程内存开销很大 , 如果这种编写方式无法替换的话 建议用多线程去实现 , 即第一层for的 每个l 放进一个线程 , 把下面的逻辑 写进 继承Thread类或者 实现Runnable接口 的自定义类里面 , 这样就相当于 多个线程同时 处理 你最外层 list 的每个元素 , 还有你下面 executeDb的方法 里面是怎么写的 有没有分批处理
你说的好有道理,这是怎个过程,请看看有没有问题呢 明天我再试试你说的多线程。[/quote] 你实行sql的这里 哪里是分批 啊 虽然你用了 addBatch 但是 你又把整个 list中的数据全部 添加到 Batch里面 把整个 Batch提交了这不又相当于 并没有 分批 你可以网上搜一下 JDBC 分批次 提交的代码写法 有很多
bree06 2016-07-29
  • 打赏
  • 举报
回复
getDbObjectidByPid(wirelaying)这个方法是取之前插入或者更新的表数据吗? 感觉应该是数据库影响的, 你可以在满数据140万的情况下,测试每一步sql所需要的时间,getDbObjectidByPid, insert, update的时间. insert差距应该很少, 主要是update 和select的时间
indispensableman 2016-07-29
  • 打赏
  • 举报
回复
数据库中的数据量越大,插入与更新的速度也会变慢,同样查询也会变慢。对于大量插入数据库的这种处理方式,建议可以使用分时策略,进行数据库小数据量的更新与插入,以减少服务器压力。
clon_forever 2016-07-29
  • 打赏
  • 举报
回复
引用 1 楼 qq646222123 的回复:
你的具体需求虽然我不知道,但是一般循环套循环 , 循环内还要数据操作的 , 数据量小了到看不出来什么来 , 数据量大了就不行 , 一个请求需要双层迭代 , 单线程内存开销很大 , 如果这种编写方式无法替换的话 建议用多线程去实现 , 即第一层for的 每个l 放进一个线程 , 把下面的逻辑 写进 继承Thread类或者 实现Runnable接口 的自定义类里面 , 这样就相当于 多个线程同时 处理 你最外层 list 的每个元素 , 还有你下面 executeDb的方法 里面是怎么写的 有没有分批处理




你说的好有道理,这是怎个过程,请看看有没有问题呢
明天我再试试你说的多线程。
科比请留步 2016-07-29
  • 打赏
  • 举报
回复
用批处理啊,可以解决
  • 打赏
  • 举报
回复
你的具体需求虽然我不知道,但是一般循环套循环 , 循环内还要数据操作的 , 数据量小了到看不出来什么来 , 数据量大了就不行 , 一个请求需要双层迭代 , 单线程内存开销很大 , 如果这种编写方式无法替换的话 建议用多线程去实现 , 即第一层for的 每个l 放进一个线程 , 把下面的逻辑 写进 继承Thread类或者 实现Runnable接口 的自定义类里面 , 这样就相当于 多个线程同时 处理 你最外层 list 的每个元素 , 还有你下面 executeDb的方法 里面是怎么写的 有没有分批处理

81,122

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧