HTTP获取响应数据超时

蔡佳娃 发布于 2015/05/26 21:58
阅读 1K+
收藏 0

环境:

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

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

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

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

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

加载中
1
Adairs
Adairs

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

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

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

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

蔡佳娃
蔡佳娃
确实是锁的问题,一直没反应过来,调用服务的service层,通过set方法设置了一个从持久态的对象(hibernate从3.X迁移到4.X后,持久态对象通过set方法设置后,无须显示update,我还以为不会更新),而在服务的业务流程中去更新,结果表已经在service层中锁了,服务的业务迟迟拿不到锁,事务无法提交,导致服务最后超时。
蔡佳娃
蔡佳娃
引擎是innodb,数据库这就是一个单表的更新和插入。可以排除数据库锁的原因。后台是一个管理系统,由前端页面上的一个操作,触发后台去调用服务,这里也没并发啊。超时相关的参数也都设置了,没一点作用。
0
Adairs
Adairs
问题解决了吗?
蔡佳娃
蔡佳娃
没有。我现在把他放到服务器上了,就不出现了
返回顶部
顶部