java后台使用for循环处理数据太慢,怎么进行优化,下面是代码,总共要执行400多次把,每次循环20ms,循环下拉就8s了,怎么优化呢

阿凡达哒哒哒 2019-04-08 04:29:20
System.out.println(t3-t2+"ms查所有一级部门预算时间");
System.out.println(depExpInfoStatlist.size()+"一级部门数量");
for(int i=0;i<depExpInfoStatlist.size();i++) {
depExpInfoStat = depExpInfoStatlist.get(i);
depId1 = depExpInfoStat.getDepId();
budgetYear1 = depExpInfoStat.getBudgetYear();
budgetAmount = depExpInfoStat.getBudgetAmount();
if(budgetAmount==null) {
budgetAmount =new BigDecimal(0);
}
depExpInfoStat1 =iAgencyExpDao.queryAllDepExpStatic(depId1,budgetYear1);
noExpOver = iAgencyExpDao.queryNoExpOver(depId1,budgetYear1);


}
long t4 = System.currentTimeMillis();
System.out.println(t4-t3+"所有数据处理完");
...全文
4231 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
鸣鸣Amadues 2019-04-22
  • 打赏
  • 举报
回复
循环里最好不要做SQL这是很基本的东西
awitingzz 2019-04-19
  • 打赏
  • 举报
回复
无力吐槽!你看看你都创建了多少BigDecimal对象?
greadworld 2019-04-17
  • 打赏
  • 举报
回复
首先这种慢的情况都有套路的, 然后呢套路如下: 1.代码效率低下,这种情况很少,各种无脑的for循环嵌套,处理的方法就是优化代码,清晰的逻辑写出来的代码干净又有效率。 2.sql冗长且无关数据太多,处理的方法就是只查自己需要的,没事别乱取数据,比如你只用A字段结果拿了个类型为text的B字段,当然回慢下来。 3.数据量大,这种情况下最为复杂, 对于经常查询但极少更改的数据,做缓存这个方法最简单,效果又好; 加适当的索引,会极大程度上的提升查询效率,但是乱加索引会影响其他的效率,比如增删改; 绝大部分情况下,避免N+1,数据库连接也是耗时间的,10ms一次1000次那耗时就上去了,能再sql层面直接取出连接好的数据,就直接去,不能直接取可以分两次取出后再代码里连接。极少数情况下N+1是可取的,这种情况很特殊,并不是所谓的一定不能写N+1 总的来说,优先定位原因,根据原因对应的处理就好了。
HellowMeng 2019-04-15
  • 打赏
  • 举报
回复
你可以查阅之前打开事物处理,查询完毕后关闭事物处理
济南彭于晏 2019-04-13
  • 打赏
  • 举报
回复
不常用的数据的话 试试放redis里面如何呢...
To Believe Me 2019-04-11
  • 打赏
  • 举报
回复
不一定业务数据全部需要Sql来查询,必要的时候可以通过程序筛选一部分
To Believe Me 2019-04-11
  • 打赏
  • 举报
回复
可以了解一下jdk1.8中的Stream流来提高执行效率
  • 打赏
  • 举报
回复
sql 语句用in查询,不需要每次循环执行一句sql
十八道胡同 2019-04-10
  • 打赏
  • 举报
回复
引用 8 楼 Believe_BaiYun 的回复:
嗯,谢谢各位,这个sql是经常变化的所以不能放内存对象,循环内部执行也不能少,所以我还是重写下sql
对,优化下sql 索引或者where 顺序 调整下
阿凡达哒哒哒 2019-04-10
  • 打赏
  • 举报
回复
嗯,谢谢各位,这个sql是经常变化的所以不能放内存对象,循环内部执行也不能少,所以我还是重写下sql
cheng297 2019-04-10
  • 打赏
  • 举报
回复
最好不要在循环里面调用DAO,最好一次性就把数据拿出来,然后再在后台处理,这样速度会快很多。要是在循环里面调用SQL的话,只要循环次数稍微大一点,这速度就会很慢了。
maradona1984 2019-04-10
  • 打赏
  • 举报
回复
https://blog.csdn.net/Guanjs2016/article/details/80237490
mysql多个字段同时in
并不需要查询多次,只要构造好参数,sql只查一次,把所有数据查出来,然后再循环
慢的是网络IO,在内存中循环的时间可以忽略不计
nayi_224 2019-04-10
  • 打赏
  • 举报
回复
不需要for循环,depExpInfoStat1 和noExpOver 直接在查询depExpInfoStatlist的时候就能查出来。重写一下sql吧。
yo嚛嚛yo 2019-04-10
  • 打赏
  • 举报
回复
这个数据如果不经常变化,就提前算好放内存对象里面。 赞成
代码间的舞者 2019-04-08
  • 打赏
  • 举报
回复
那问题就清楚了。优化下这两个dao对应SQL语句。
阿凡达哒哒哒 2019-04-08
  • 打赏
  • 举报
回复
就是哪两个dao操作差不对都是10ms左右,只是循环次数一多,就变慢了
十八道胡同 2019-04-08
  • 打赏
  • 举报
回复
这个数据如果不经常变化,就提前算好放内存对象里面。 是哪句耗时多?

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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