for循环以及数据库查询优化方案

一、概要

前提:
1、数据库SQL: 已经优化到极致,仍然查询慢

2,数据库语句有可拆分查询的空间

3、数据量大、接口访问时间过长


方案:
1、优化for循环体内,存在访问数据库的代码

2、使用并行流进行stream分组优化 (多线程)

3、使用并行流优化for循环(多线程)
4、使用多线程优化数据库查询速度

二、案例说明

1、需求格式(所有企业下所有排口以及各个排口的所有日数据)

2,性能差的写法(禁止使用

此种写法双重for循环 还进行访问数据库查询,会严重导致查询效率,我们需要进行提取。

3、优化方案1:提取for循环内置查询,流分组操作 

4、优化方案2:分组并行流优化、for循环并行流优化

方案1,优化完毕如果接口优化完毕还不能满足要求,这些可以发现大数据量分组感觉比较慢的问题,for循环也比较费时间.所以现在对这2个进行优化,数据量小可以忽略 

For循环采用iava8的并行流循环(底层都是多线程处理,并收集合并数据)
分组采用并行流分组 (底层都是多线程处理,并收集合并数据)

5、优化方案3:对数据库查询进行优化 

上面2种方案,应该能满足大多接口响应慢的问题。不过部分业务仍加载慢: 其中根本原因在于数据语句查询过慢,而数据库语句已经改无可改。那证明数据库每条语句查询时间已经比较固定了。目前就只能并行处理各个sql。

例如: sql1要花费 5秒
sql2 要花费10秒
sql3要花费6秒
在sql无法优化的情况下 我们只能保证数据在10s完成查询。不能进行累加操作花费21s

2、调用异步线程类收集结果 

6、使用到@Async注解,必须自定义线程池 

@Async异步方法默认
核心线程数为8
最大队列和最大线程都是Integer.MAX_VALUE
创建线程的前提条件是队列填满时,默认的配置永远不会填满
如果有@Async这个注解的方法长期占用线程,在核心8个线程数满了后,新的调用就会进入队列,外部表现没有执行。


项目增加线程池的配置类(有配置的可不用增加):具体配置文件见SVN 

优化方案3的异步类: @Async注解指定使用自定义线程池 

三、结语

本文主要优化方式,都是结合多线程进行优化并推崇用iava8的对应写法。具体iava8语法不了解的可以自行寻找资料进行学习
如果数据量少的情况下用foreach的循环写法Stream流循环针对数据量大的情况下会更具优势,小数据不明显 

  • 10
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Java循环条件的数据库查询可以通过以下几种方法来优化: 1. 减少数据库请求的次数:尽量减少对数据库的询问,可以将所需的多个数据请求合并为一次请求。 2. 使用缓存:对于常用的数据可以使用缓存,减少对数据库的询问。 3. 使用索引:对查询的字段建立索引,可以提高查询速度。 4. 使用预处理语句:使用预处理语句可以提高数据库查询的效率。 5. 使用连接池:使用连接池可以避免频繁地打开和关闭数据库连接,提高数据库访问的效率。 6. 使用简单的SQL语句:使用简单的SQL语句可以减少数据库的处理量,提高查询效率。 ### 回答2: 在进行Java循环条件数据库查询优化时,有以下几个方面可以考虑: 1.缩小查询结果集:尽量在查询条件中加入更多的限制条件,如使用索引、使用更精确的条件等,以减少返回的数据量,从而提高查询速度。 2.合理使用缓存:在查询过程中,可以尝试使用缓存来存储已查询的数据,避免多次查询相同的数据,从而减少数据库的访问次数。 3.批量操作:对于需要进行批量查询的情况,可以考虑使用批量操作,将多个查询请求合并为一个请求,减少与数据库的交互次数,提高效率。 4.适当使用连接池:连接池可以帮助管理数据库连接,减少连接的创建和销毁开销,提高数据库访问的效率。 5.优化SQL语句:尽量避免使用复杂的SQL语句,可以使用数据库的查询优化工具或者调整查询语句的结构,以提高查询的效率。 6.合理设计数据库表结构:在设计数据库表结构时,对于频繁查询的字段可以加上索引,以提高查询速度。 7.合理使用数据库的缓存和索引:根据具体的需求,可以合理地使用数据库的缓存和索引功能,以提高查询效率。 总的来说,对于Java循环条件数据库查询优化,需要从多个方面综合考虑,结合具体的场景和需求,采取相应的措施来提高查询的效率。 ### 回答3: 在Java中,优化循环条件的数据库查询是通过以下几个步骤来实现的: 1.将频繁查询的数据缓存起来:使用缓存技术将数据库的结果存储在内存中,这样可以避免多次查询数据库。可以使用一个集合或者使用第三方的缓存工具来实现。 2.合并多个查询条件:如果查询条件中存在多个AND条件,可以考虑将这些条件合并成一个条件,这样可以减少数据库的查询次数。如使用IN语句代替多个OR条件。 3.使用索引:索引可以极大地提高查询速度,可以在需要经常查询的字段上创建索引。当有多个字段组合查询时,可以创建复合索引。 4.减少数据库交互的次数:可以使用批处理的方式来处理数据库操作,将多个操作合并成一个批处理操作,减少与数据库的交互次数。 5.使用分页查询:如果查询结果集很大,可以考虑使用分页的方式查询,每次只查询部分数据。这样可以减少数据库的负担和提高查询效率。 6.使用合适的数据类型:在数据库中使用合适的数据类型,可以提高查询效率。例如,如果一个字段存储的是日期类型的数据,可以使用日期类型的数据字段,而不是字符串类型。 7.优化SQL语句:通过调整SQL语句,可以提高查询效率。可以通过添加索引、优化查询条件、使用合适的连接方式等方式来优化SQL语句。 8.定期清理无用数据:当数据库中存在大量无用数据时,会影响查询效率。所以定期清理无用数据,保持数据库的整洁。 总结:通过缓存、索引、合并查询条件、减少数据库交互、分页查询、使用合适的数据类型、优化SQL语句和定期清理无用数据等方法,可以有效优化循环条件的数据库查询

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

有心不在迟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值