/**************************转自同事的技术博客*************************/
一、该问题的重现步骤是什么?
1.现象:高并发场景(均是和疫情相关:电子通行证上线第一天、外来人口摸排登记上线第一天)下系统崩溃假死,其中摸排登记系统上线第一天2-3小时内PV达到了近80万,QPS尚未进行测算统计,理论上并不会太高。
2.出现的日志特征:
3.继续跟踪:
项目采用了docker部署模式,
通过docker exec -it container_name /bin/bash 命令进入容器,
采用jps命令查找java进程id,docker中是1,
采用top -Hp 1命令查看对应的资源占用情况,
采用jstack 1 > jstack.log命令将堆栈信息导出到文件jstack.log中。
二、问题锁定
再继续向上跟踪,找到getConnectionInternal方法(private DruidPooledConnection getConnectionInternal(long maxWait)throwsSQLException):
通过maxWatit参数来判定是否走takeLast流程,而maxWatit的值始终是默认值-1,而不是application.yml配置文件中的60000。
那么,问题来了,application.yml配置文件中所有关于druid的配置(在spring.datasource.druid中配置)参数都没有生效。
三、问题解决
修改application.yml druid配置
四、修改配置后的效果
经过以上调整(1-调整druid参数配置位置,放置于动态数据源节点下;2-升级druid-spring-boot-starter版本至1.2.1及以上),同样的环境原本压测只能压到100左右的系统,目前可以抗到2000以上(受限于压测工具的客户端,尚未测试出极限值)。
扫一扫访问 Blade技术社区 移动端