首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java如何定位自己项目中的慢业务

因为如果是前端解析缓慢的话,身为后端,我们也没什么好的处理办法,但是如果另外的两种情况,那么我们就可以来好好的掰扯一下了。 代码业务问题 那么什么是会出现代码业务问题呢?...,也就是我们通常所说的最不可取的那种 for 循环中有查询。...如果这时候每个月的数据计算相互都是独立的,我们完全可以采用多线程方式进行: // 建立一个线程池,注意要放在外面,不要每次执行代码就建立一个,具体线程池的使用就不展开了 public static ExecutorService...(() -> methodA()); CompletableFuture futureB = CompletableFuture.supplyAsync(() -> methodB()); CompletableFuture.allOf...慢查询日志记录慢SQL 定位慢SQL可以通过慢查询日志来查看慢SQL,默认的情况下,MySQL数据库不开启慢查询日志(slow query log),需要手动它打开 SET GLOBAL slow_query_log

63020

线上sql执行慢,分享3个优化案例

前段时间,博主线上项目的几个后端接口执行耗时达到了三、四秒钟以上,查看接口代码,发现 sql 语句执行过慢,于是开始分析 sql 执行 这里比较经典的优化案例分享给大家。...二、update 批量更新优化博主以前线上项目(Spring Boot + Mybatis)有一个接口需要批量更新库存,当时博主本着不能再代码 for 循环中执行更新逻辑的初衷,决定再 xml 文件中使用...这个写法虽然不是在代码 for 循环中执行,但是这条 sql 语句执行时,MySql 任然是单条单条执行的。...那有没有一种高级一点的写法来执行 update 批量更新嘞?...(futures.toArray(new CompletableFuture[0])).join()」 方法,等所有任务执行完成拿到结果。

1K21
您找到你想要的搜索结果了吗?
是的
没有找到

异步,同步,阻塞,非阻塞程序的实现

终于用透支生命的方法这一课学完了。感动。以后不这样了。 实现异步非阻塞是一个大命题,这里只从原理出发。我会慢慢修改这篇文章。 本文将从异步sleep的实现入手,来讲解异步非阻塞程序的原理。...如果是同步,线程会等待接受函数的返回值(或者轮函数结果,直到查出它的返回状态和返回值)。如果是异步,线程不需要做任何处理,在函数执行完毕后会推送通知或者调用回调函数。...当前任务移除任务队列。 上面的代码中,在一个while循环中timer的状态。由于timer存在于wait中。所以需要把timer“提取”出来。...timer 从生存器gen yield返回出来 2. 轮timer的状态(实质是切换进出timer,看它有没有引发StopIteration异常) 3....也就是说,在每个要处理阻塞的地方,都人为的函数切成三个部分: 1. 执行函数前半部 2. 执行新线程,后半部作为回调函数传入。函数退出。 3. 等待后半部在线程完毕后被执行。

7.5K10

CompletableFuture的使用

} executorService.shutdown(); } } 输出结果: 结果1 结果2 结果3 一般大家都会这样使用线程池,但是有没有思考过这样使用有没有什么问题...遍历list集合,提交CompletableFuture任务,结果转换成数组 再把数组放到CompletableFuture的allOf()方法里面 最后调用join()方法阻塞等待所有任务执行完成...3.3 一个线程执行完成,交给另一个线程接着执行 有这么一个需求: 一个线程处理完成,处理的结果交给另一个线程继续处理,怎么实现?...这么好用的CompletableFuture有没有其他功能?当然有。 4....饭还没做好,我点外卖了 如果注释的sleep()方法放开,输出结果就是: 饭做好了 4.3 either方法使用示例 /** * @author yideng * @apiNote

43430

C语言中循环语句总结

while坏:  for循环:  while和for循环的对比: 区别:for 和 while 在实现循环的过程中都有初始化、判断、调整这三个部分,但是 for 循环的三个部 分⾮常集中,便于代码的维护...如果你希望 n 的初始值为 0 时不进行计算,可以改用 while 循环并将判断条件放在循环之前。  break和continue在循环语句中的作用 break:永久的终⽌循环....for(i=1; i<=10; i++) { if(i == 5) break; printf("%d ", i); } return 0; } 运行结果: continue:跳过本次....环中 continue 后的代码,直接去到循环的调整部分。...) continue;//这⾥continue跳过了后边的打印,来到了i++的调整部分 printf("%d ", i); } return 0; } 运行结果: 对比for循环和while循环中

11410

抓到Dubbo异步调用的小BUG,再送你一个贡献开源代码的机会

图片问题复现遇到问题,尤其不是自己遇到的,必须要复现出来才好排查,截一个当时的聊天记录:图片他的问题原话是:今天发现一个问题 有一个dubbo接口返回类型是boolean, 接口从同步改成异步 server...端返回true 消费端却返回false,boolean改成Boolean就能正常返回结果 有碰到过这个问题吗注意几个重点:接口返回类型是boolean同步改为异步调用返回的boolean和预期不符合...这里的逻辑是如果返回的结果不为null且不为CompletableFuture的实例就直接将CompletableFuture设置为完成,立马执行回调。暂且不管这个逻辑。...这里的callable是Dubbo生成的一个代理类,其实就是封装了调用Provider的逻辑,有没有办法看看他封装的逻辑呢?有!用arthas。...修复的办法就是在injvm分支这里加上判断,如果是injvm调用还是保持现状,如果不是injvm调用,直接忽略,走最后的return逻辑:public CompletableFuture

59451

Java8已经发布7年了,不会还有人没用过CompletableFuture

e.printStackTrace(); } } executorService.shutdown(); }}输出结果:结果1结果2结果3一般大家都会这样使用线程池,但是有没有思考过这样使用有没有什么问题...遍历list集合,提交CompletableFuture任务,结果转换成数组再把数组放到CompletableFuture的allOf()方法里面最后调用join()方法阻塞等待所有任务执行完成CompletableFuture...3.3 一个线程执行完成,交给另一个线程接着执行有这么一个需求:一个线程处理完成,处理的结果交给另一个线程继续处理,怎么实现?...这么好用的CompletableFuture有没有其他功能?当然有。4....("饭还没做好,我点外卖了"); System.out.println(completableFuture.join()); }}输出结果:饭还没做好,我点外卖了如果注释的sleep

46510

CompletableFuture 让你的代码免受阻塞之苦

假设场景 现在你需要为在线教育平台提供一个查询用户详情的API,该接口需要返回用户的基本信息,标签信息,这两个信息存放在不同位置,需要远程调用来获取这两个信息;为了模拟远程调用,我们需要在代码里面延迟...CompletableFuture 让你的代码免受阻塞之苦 Future实现的版本 接下来我们这个例子用Java7提供的 Future 来实现异步的版本,看下效果如何呢?...CompletableFuture 让你的代码免受阻塞之苦 和Java8之前的实现对比,我们发现整个代码会更加的简洁; 接下来我们我们的例子改变一下,查询用户详情的接口还需要返回视频观看记录,用户的标签信息...,难道就有没有其他的方式可以让它在快一点吗?...;比如第一个和第二个操作返回的结果做字符串的连接操作 总结 CompletableFuture CompletableFuture 来源:https://www.tuicool.com/articles

76120

接口优化方案实践

最关键的地方有两点: 在接口中远程调用了另外一个接口 需要在for循环中查询数据 其中的第1点,即:在接口中远程调用了另外一个接口,这个代码是必须的。...这样看来,可以优化的地方只能在:for循环中查询数据。 优化方案 第一次优化 由于需要在for循环中,每条记录都要根据不同的条件,查询出想要的数据。...其实,有一种办法不用循环查询,一条sql就能搞定需求:使用or关键字拼接,例如:(org_code='001' and category_id=123 and business_id=111 and business_type...代码调整为: CompletableFuture[] futureArray = dataList.stream() .map(data -> CompletableFuture...还不如批量评价查询接口的服务器中,线程池的最大线程数调大一点? 显然你忽略了一件事:线上应用一般不会被部署成单点。绝大多数情况下,为了避免因为服务器挂了,造成单点故障,基本会部署至少2个节点。

1.1K80

从20s优化到500ms,我用了这三招

最关键的地方有两点: 在接口中远程调用了另外一个接口 需要在for循环中查询数据 其中的第1点,即:在接口中远程调用了另外一个接口,这个代码是必须的。...这样看来,可以优化的地方只能在:for循环中查询数据。 3. 第一次优化 由于需要在for循环中,每条记录都要根据不同的条件,查询出想要的数据。...其实,有一种办法不用循环查询,一条sql就能搞定需求:使用or关键字拼接,例如:(org_code='001' and category_id=123 and business_id=111 and business_type...代码调整为: CompletableFuture[] futureArray = dataList.stream() .map(data -> CompletableFuture...还不如批量评价查询接口的服务器中,线程池的最大线程数调大一点? 显然你忽略了一件事:线上应用一般不会被部署成单点。绝大多数情况下,为了避免因为服务器挂了,造成单点故障,基本会部署至少2个节点。

55070

ai对话---多线程并发处理问题

DeferredResult deferredResult = new DeferredResult(); CompletableFuture.supplyAsync(() -> { try { callable...;//清空 return answer; } } 再来讲这个和ai之间的对话的接口原理 实际上在每个main函数当中会构建一个WebSocket的服务区跟他进行对话 而当 每一个对话结束 实际上是没有话说完的...在异步任务的实现中,使用CompletableFuture.supplyAsync()方法创建一个异步任务,并在其中执行具体的业务逻辑。...=null){//这里进行了判断 这个用户有没有历史记录 bigModelNew=new BigModelNew(userid, false,getHistory(userid),stringRedisTemplate...bigModelNew=new BigModelNew(userid, false,historyList,stringRedisTemplate); } //… } 这样我们就能异步的处理这些对话消息 并且他们放在对应的缓存空间当中

15810

实战|我们又来了,一次授权渗透测试的记录

手里最近有一个学校授权的项目,我今天渗透过程写一下 这个管理员很吊,直接甩手一个IP,一个你自己看着来吧的眼神,emmmmm……… 来吧,谁让拿人家的毛爷爷了呢,掏出落灰的Nmap,全端口给我扫起 Nmap...有点东西,2008的服务器,MS17-010和CVE-2019-0708这两个屌炸天的漏洞都不存在,管理员还可以,也是有一个打补丁的好习惯嘛,哈哈哈哈哈哈哈啊哈 爆破下21和3389看看有没有弱口令 (...既然都不存在,咱们扫扫目录吧 (登入框常见渗透思路:弱口令、要么注入、再么找JS文件或者看看有没有api接口泄露,在这里先透露一个小道消息,因为上周我去别的市参加红蓝对抗了,有一个目标系统就是当时弱口令跟注入都没有...牛批,牛批,牛批,为了方便用户登录,登录信息写死了,那我就不客气了,登录! ? 一个每天都在正常使用的考勤打卡系统,我们继续往下看看 ?...我们更新的文章指向渐进,不想发的太复杂,基础慢慢往上。 有些时候别人说我们发的大多部分都是弱口令,但是人家确实存在弱口令,我也没办法啊。或者各位有什么好的建议可以给公众号留言,我都有看的。

1.2K50

java分布式系统开关功能设计(服务升降级)

这个时候就需要通过一些办法办法很多,可以是消息系统,可以是zookeeper,可以是页面触发)来清理一下开关属性的缓存,让缓存重新加载一下,从而实现最新的状态获取。...这个是不是有点复杂,有没有更加简单的办法?...的服务端,看看开关属性的数据有没有变更,如果有变更,在diamond服务端来加载最新的数据)。...总体思路是:在diamond中维护配置信息--系统订阅开关属性--系统轮配置是否有变更,有变更直接就变掉了。...这时候业务降级,并不是完全100%的停掉,可以预留一部分流量继续调用A,A调用的信息放入队列中,根据这些信息,就能实现升级了); 总结

1.8K30

C语言代码优化的一些经验及小技巧(三)

如果循环迭代次数只有几次,那么可以完全展开循环,以便消除坏带来的负担。...condition)放在前面,若condition为2概率大较大则if (2 == condition)放在前面,如: if (2 == condition) { } else if (1 == condition...) { } else { } 这里有个小细节:在用if判断某个变量与某个常量是否相等时,可以常量写在前面变量写在后面,如: if (2 == condition) 2放在前面,condition放在后面...比如使用查表法,一些可能的结果事先保存到表中。...尽量使循环体内的工作量达到最小化 循环中,随着循环次数的增加,会加大对系统资源的消耗。我们应当确认一些操作是否必须放在循环体内。

2.2K21

哪些问题会引起接口性能问题

④join 过多 or 子查询过多 我 join 过多和子查询过多放在一起说了。一般来说,不建议使用子查询,可以把子查询改成 join 来优化。...计算某个月的数据,逻辑比较复杂,难以批量计算,效率也无法很高 list.add(model); } 这种显然每个月的数据计算相互都是独立的,我们完全可以采用多线程方式进行: // 建立一个线程池,注意要放在外面...解决: CompletableFuture futureA = CompletableFuture.supplyAsync(() -> doA()); CompletableFuture...当我们实在是没有办法排查出问题,或者实在是没有优化空间的时候,可以尝试这种万金油的方式。...当然,为了防止多业务方接入的时候回调接口不统一,可以结果抛进 kafka,让调用方监听自己的结果。

8010

JUC系列(七) ForkJion任务拆分与异步回调

ForkJion 什么是ForkJoin ForkJoin 下 JDK 1.7 并行执行任务的,数量越大,效率越高 比如 :大数据 Map Reduce(大任务拆分成小任务) ForkJoin 特点...start - end) / 2; forkjoinDemo task1 = new forkjoinDemo(start, mid); //拆分任务,任务压入线程队列...B图表达的是使用Future模式之后,我们主线程在invoke之后可以立即返回,去做其他的事情,回头再来看看刚才提交的invoke有没有结果。...我们需要新的,更强大的拓展,CompletableFuture 在Java 8中, 新增加了一个包含50个方法左右的类: CompletableFuture,结合了Future的优点,提供了非常强大的Future...(); // 有返回值的 CompletableFuture completableFuture = CompletableFuture.supplyAsync

29760

【Java后端面试经历】我和阿里面试官的“又”一次“邂逅”(附问题详解)

CompletableFuture 呢? Netty : 介绍一下自己对 Netty 的认识,为什么要用 通俗地说一下使用 Netty 可以做什么事情? 什么是 TCP 粘包/拆包,解决办法。...面试官 :那你说说有没有解决办法有没有想到多线程中哪个常用的关键字? ? 我 :哦哦!我记起来了!使用 volatile 修饰变量就可以禁止 JVM 的指令重排,保证在多线程环境下也能正常运行。...我们甚至可以 内存可以看作外存的高速缓存,程序运行的时候我们外存的数据复制到内存,由于内存的处理速度远远高于外存,这样提高了处理速度。...面试官 :有没有可以改进的地方呢? ? 我 :可以提示一下具体的改进方向不? ?‍?面试官 :Java 8 的新增加的一个多线程处理的类。 ? 我 :是 CompletableFuture 吧!...TCP 粘包/拆包以及解决办法 ?‍?面试官 :什么是 TCP 粘包/拆包,解决办法? ?

1K20

聊聊接口性能优化的11个小技巧

为了实现起来比较方便,通常我们会将这些逻辑放在接口中同步执行,势必会对接口性能造成一定的影响。...这样接口中重点关注的是业务操作,其他的逻辑交给线程异步执行,这样改造之后,让接口性能瞬间提升了。...有没有办法,不经过请求远程,就能直接获取到数据呢? 答:使用二级缓存,即基于内存的缓存。 除了自己手写的内存缓存之后,目前使用比较多的内存缓存框架有:guava、Ehcache、caffine等。...超过指定时间的sql语句,单独记录下来,方面以后分析和定位问题。...该接口一次请求的链路很长,如果逐一排查,需要花费大量的时间,这时候,我们已经没法用传统的办法定位问题了。 有没有办法解决这问题呢? 用分布式链路跟踪系统:skywalking。

37520
领券