这是个很神奇的问题,由于测试环境和生产环境在数据量上存在差异,可能导致某个环境出现这个问题,而另外的环境没有这个问题,甚至出现某人出现这个问题,而其他人正常的情况。
由于压测,给某人发放了很多卡券资源,这时这个用户查询卡券信息时又不存在分页,那会出现问题。
测试环境的会员订单数据只有几百条,而生产环境有几百万条订单数据,由于没有索引,会员查询自己订单列表出现该异常。
多表关联查询时,某个表没有设置合理的索引。
……
2020-08-12 09:44:54,947 WARN [scheduling-1] o.h.e.j.s.SqlExceptionHelper [SqlExceptionHelper.java:137] SQL Error: 0, SQLState: null
2020-08-12 09:44:54,948 ERROR [scheduling-1] o.h.e.j.s.SqlExceptionHelper [SqlExceptionHelper.java:142] HikariPool-1 - Connection is not available, request timed out after 6000ms.
Caused by: org.hibernate.exception.JDBCConnectionException: Unable to acquire JDBC Connection
可以排查的维度会有很多,最容易的方式是将Mysql的慢查询日志打开。
查询结果数据量庞大(一次吞吐数据特别大)
SET timestamp=1597200735
select * ....
在慢查询日志上可以看见,这个SQL的查询时间在1.384438
秒内完成,查询出7481
条数据,数据量太庞大了。返回这么多数据干嘛,业务层面可以分页,或者分批次操作。
复杂查询(慢查询)
函数统计、聚合、计算相关的查询数据库表数据量过大,又没按照索引查询关联表太多,SQL不合理
一般表现为查询时间耗时久,一直占用连接,导致资源供不应求。这时候需要优化SQL、索引、或者在业务层面避免这类查询。
大量请求频繁访问数据库,导致连接池耗尽,后续业务无法获取到数据库连接。
在数据库性能允许的情况下增加连接池链接。综合考虑数据查询实时性、重复率等等,加一些Cache来解决。NoSQL是否可以帮助承载一定量压力?读写分离,多实例读。按照实际业务进行分表。
《注定成为最穷的程序员…… @ 待业科技(大连)有限公司
610.2k
粉丝