HTTP获取响应数据超时

HTTP获取响应数据超时

左岸枫 发布于 2021-11-26 字数 902 浏览 856 回复 5

环境:

java web工程 管理后台和服务暂时一个项目中,运行容器为tomcat。

服务是基于http的,对外暴露的只有一个统一的接口。接口的处理流程大体如下:

public void deal() {
    
    saveOrUpdate();
    
    new Thread(new Runnerable() { //这块就表示异步处理
        public void run() {
            //一些数据同步处理
        }
    });
}

管理后台去调用服务时,有时会出现获取响应数据超时这个异常。通过看日志,就是发现进入deal后,会执行完saveOrUpdate,然后就感觉IO阻塞了,一直等出现超时异常后,异步处理那部分代码才开始执行,感觉一下后台和服务变成了串行。但是我在单元测试中,循环调用n次服务都不会重现该问题。

我们这个项目是分级部署的,当服务和服务之间相互调用时,这个问题也没有。

现在怀疑是因为后台管理和服务部署在一块导致的,但是不知道问题出在哪里,还请有经验的oscer指点迷津。

如果你对这篇文章有疑问,欢迎到本站 社区 发帖提问或使用手Q扫描下方二维码加群参与讨论,获取更多帮助。

扫码加入群聊

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

猫九 2021-12-01 5 楼

没有。我现在把他放到服务器上了,就不出现了

残花月 2021-12-01 4 楼

问题解决了吗?

回眸一笑 2021-11-30 3 楼

引擎是innodb,数据库这就是一个单表的更新和插入。可以排除数据库锁的原因。后台是一个管理系统,由前端页面上的一个操作,触发后台去调用服务,这里也没并发啊。超时相关的参数也都设置了,没一点作用。

永不分离 2021-11-30 2 楼

确实是锁的问题,一直没反应过来,调用服务的service层,通过set方法设置了一个从持久态的对象(hibernate从3.X迁移到4.X后,持久态对象通过set方法设置后,无须显示update,我还以为不会更新),而在服务的业务流程中去更新,结果表已经在service层中锁了,服务的业务迟迟拿不到锁,事务无法提交,导致服务最后超时。

坚持沉默 2021-11-29 1 楼

这个不是IO阻塞,很大的可能是因为数据库锁定造成的。

你在saveOrUpdate时,会锁定表,造成下个请求不能进行,你在做测试的时候,是单个线程串行访问,建议你多线程测试一下,应该就有问题了。

尽量把saveOrUpdate方法修改一下,只保存,或者只修改。

如果是mysql的话,考虑一下使用innodb引擎。