Java Broken Pipe以及OOM

最近碰到一个问题,求老哥们指点:
我们有一个公司表,单表数据量3亿多,还有一个产品表,单表数据量2.7亿,这两个表要关联查询,构造的条件不同,查询的时间快慢也不同,大概在3s~90s之间吧。
因为用户根据条件搜索后,肯定是要等待结果出现,但是如果用户搜索了几个慢SQL后,通过SHOW FULL PROCESSLIST命令,在MySQL中是可以看到那几条慢SQL还在执行的,但是看日志报错有org.apache.catalina.connector.ClientAbortException: java.io.IOException: Broken pipe,目前猜测是查询时间太长了,然后Nginx主动断开连接了,但是这几个慢SQL会导致整个程序卡死,有时候在很多个Broken Pipe之后,还会出现OOM,然后程序就挂掉了,因为这个问题,我已经被老板吵过好几次了,有什么解决办法吗?SQL已经没法优化了,因为单表数据量在那里放着呢,另外也不要从分库分表考虑,因为是小公司,公司就我一个Java,肯定是不让动数据的,我只想不让Java程序挂掉,有解决办法吗?老哥们

单表那么大数据,不关联查都慢啦,还不给分库分表

单表撑这么多数据确实难,试试表分区能解决问题不?

按你的思路来说,只有你一个java,并且你不想java程序挂掉;
那先给你一个简单的【骚操作】
1、修改nginx超时时间,保证你的请求不会过期;
2、使用分布式的缓存--比如redis,你可以把几个常用表的数据,直接查出放在redis中,然后按需去更新,这样,你至少可以有个缓冲时间。


当然,以上的操作,只是缓解而已,要想真正的解决,那还得下底层处理。
比如前面回答的分库分表;(这个涉及到业务,修改很多,加班很多)
比如上分布式。(这个涉及到更多,除了业务,你还需要进行技术选型,技术追踪,修改更多,加班更多)


综合来看,还是我的缓冲操作适合你。

那就限流把,发现还有未执行完的请求,再进来请求就返回前端,当前查询人数过多,请稍后再试

可以从下面几个方面着手处理:

1、在工程的连接mysql的配置文件那里把连接超时时长设置的大一点;
2、将nginx的超时时长根据实际情况也适当设置大一点;
3、设置mysql的超时时长,参考这篇文章:https://blog.ohyeahwoo.com/?p=906