做了一个接口,查询mongdb的,然后根据日志分析发现有个别请求非常慢,甚至主键查询都要几分钟了,通过生产实测,了解 到当时其实据库压力并不大,而且相同的条件直接用sql跑还是1秒左右返回的,就是在用接口调用的时候,一直在等待请求进入,导致最后返回耗时比较长,请问这个该怎么优化,优化方向在那里,谢谢各位大佬了
码龄 粉丝数 原力等级 --
- 被采纳
- 被点赞
- 采纳率
java 接口请求访问阻塞问题
收起
- 写回答
- 好问题 0 提建议
- 关注问题
- 微信扫一扫点击复制链接分享
- 邀请回答
- 编辑 收藏 删除 结题
- 收藏 举报
4条回答 默认 最新
- 关注
码龄 粉丝数 原力等级 --
- 被采纳
- 被点赞
- 采纳率
devmiao 2018-01-12 07:42关注一、同步阻塞
这是早期Linux常用的IO方式,在这个模型中,用户空间的应用程序执行一个系统调用,这会导致应用程序阻塞。这意味着应用程序会一直阻塞,直到系统调用完成为止(数据传输完成或发生错误)。调用应用程序处于一种不再消费 CPU 而只是简单等待响应的状态,因此从处理的角度来看,这是非常有效的。图 1 给出了传统的阻塞 I/O 模型,这也是目前应用程序中最为常用的一种模型。其行为非常容易理解,其用法对于典型的应用程序来说都非常有效。在调用read系统调用时,应用程序会阻塞并对内核进行上下文切换。然后会触发读操作,当响应返回时(从我们正在从中读取的设备中返回),数据就被移动到用户空间的缓冲区中。然后应用程序就会解除阻塞(read调用返回)。
\
图1 同步阻塞方式
二、同步非阻塞 I/O
同步阻塞 I/O 的一种效率稍低的变种是同步非阻塞 I/O。在这种模型中,设备是以非阻塞的形式打开的。这意味着 I/O 操作不会立即完成,read操作可能会返回一个错误代码,说明这个命令不能立即满足(EAGAIN或EWOULDBLOCK),如图 2 所示。
\
图2 同步非阻塞方式
非阻塞的实现是 I/O 命令可能并不会立即满足,需要应用程序调用许多次来等待操作完成。这可能效率不高,因为在很多情况下,当内核执行这个命令时,应用程序必须要进行忙碌等待,直到数据可用为止,或者试图执行其他工作。正如图 3 所示的一样,这个方法可以引入 I/O 操作的延时,因为数据在内核中变为可用到用户调用read返回数据之间存在一定的间隔,这会导致整体数据吞吐量的降低。
三、异步阻塞方式
另外一个阻塞解决方案是带有阻塞通知的非阻塞 I/O。在这种模型中,配置的是非阻塞 I/O,然后使用阻塞select系统调用来确定一个 I/O 描述符何时有操作。使select调用非常有趣的是它可以用来为多个描述符提供通知,而不仅仅为一个描述符提供通知。对于每个提示符来说,我们可以请求这个描述符可以写数据、有读数据可用以及是否发生错误的通知。
本回答被题主选为最佳回答 , 对您是否有帮助呢? 本回答被专家选为最佳回答 , 对您是否有帮助呢? 本回答被题主和专家选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏举报微信扫一扫点击复制链接分享编辑预览轻敲空格完成输入- 显示为
- 卡片
- 标题
- 链接
评论按下Enter换行,Ctrl+Enter发表内容
- 显示为
- 卡片
- 标题
- 链接
报告相同问题?
- 2023-04-07 16:02回答 2 已采纳 因为server接受到连接的时候就要从输入流中读取数据,这个过程是阻塞的,server的inputStream实际上相当于客户端的outStream,所以客户端不写数据过来,而是先打开inputStr
- 2019-04-29 04:26回答 3 已采纳 解决了,需要配置访问的servlet和访问servlet过程中使用到的filter为异步,再调用request.startAsync()开启异步
- 2018-12-21 08:03回答 3 已采纳 ![图片说明](https://img-ask.csdn.net/upload/201812/21/1545382409_185584.png) 在cmd 窗口栏右键属性 将快速编辑模式的勾去掉解决
- 2020-08-27 02:47Java 并发访问重复请求过滤问题 Java 并发访问重复请求过滤问题是指在 Java 应用程序中,多个线程或请求同时访问同一资源,导致重复执行相同的操作,引发数据错误和混乱的问题。在本篇文章中,我们将讨论该问题的...
- 2020-04-20 09:09回答 2 已采纳 需要加上 synchronized ,是因为 Controller 类是单例,所有浏览器访问这个请求方法时,都会调用这个类的实例的。 但 Tomcat 是开启多个线程处理浏览器请求的,所以这个类是多
- 2020-07-02 07:57回答 2 已采纳 客户端传输完成后关闭输出流
- 2022-01-10 10:18回答 2 已采纳 非阻塞你就直接在A服务中调用B服务的接口执行完成后一起返回就行了啊;有用的话记得点个采纳
- 2024-05-15 08:10柠檬味的Cat的博客 Java接口限制请求次数
- 2022-07-29 03:18回答 1 已采纳 首先,假死是指某个功能无法使用还是整个系统的功能都无法使用?如果确认是所有系统都假死,那需要确认该java服务的cpu占用,以及堆内内存占用比例。如果这两个比例高,那基本可以确定是内存无法被FGC导致
- 2017-08-12 04:31回答 4 已采纳 首先,,线程只要活着,,就三种状态,就绪,阻塞,运行 运行,,cpu同一时间只能运行一个线程,,所以不可能是运行 阻塞,,被强占资源会首先变为阻塞状态(如果了解操作系统的话,会有个阻塞队列的概
- 2021-05-29 15:24回答 1 已采纳 该问题原因是TongWeb的日志输出同步,造成日志输出阻塞。 从TongWeb7.0.4.1版本开始,增加了异步日志功能,通过设置-DlogThreads=1 进行异步日志输出。
- 2023-11-09 02:13基于java socket发送http请求。这种原生的发送请求的方式能适合一些特定场景,比如: A向B发送请求,A不考虑B是否处理成功,即A不关注B的响应结果,那么A就不用阻塞等B的回应。 传统的Httpclient请求方式都是阻塞...
- 2020-09-03 04:52在Java编程中,Apache HttpClient库提供了强大的HTTP客户端接口,用于执行HTTP请求。在某些场景下,比如处理大量并发请求或不希望主线程被阻塞时,异步请求变得尤为重要。本篇文章将详细介绍如何使用Java的...
- 2021-02-28 06:14TEDDYYW的博客 发生条件:接受到一个请求,该请求没有执行完成又接受到相同请求,导致数据错误(如果是前一个请求执行完成,马上又接受相同请求不会有问题)问题分析:是由于数据库的脏读导致问题解决思路1.加一把大大的锁 (是最简单...
- 2021-02-12 05:58吴绍贵的博客 最近一个项目中接口通讯这一块主要是调用银联系统的socket接口,我方是客户端,即发送请求接收返回报文的一方。在贴代码之前,还是要了解一下关于socket的基础知识。Socket的基本概念1.建立连接当需要建立网络连接...
- 没有解决我的问题, 去提问
悬赏问题
- ¥15 PADS Logic 原理图
- ¥15 PADS Logic 图标
- ¥15 电脑和power bi环境都是英文如何将日期层次结构转换成英文
- ¥20 气象站点数据求取中~
- ¥15 如何获取APP内弹出的网址链接
- ¥15 wifi 图标不见了 不知道怎么办 上不了网 变成小地球了
- 京ICP备19004658号
- 经营性网站备案信息
- 公安备案号11010502030143
- 营业执照
- 北京互联网违法和不良信息举报中心
- 家长监护
- 中国互联网举报中心
- 网络110报警服务
- Chrome商店下载
- 账号管理规范
- 版权与免责声明
- 版权申诉
- 出版物许可证
- ©1999-2025北京创新乐知网络技术有限公司