Spring Boot Connection is not available, request timed out after 30000ms问题排查解决

本文介绍了在Spring Boot应用中遇到数据库连接超时的问题,首先检查了Hikari连接池配置,然后排查到MySQL配置,发现wait_timeout参数设置较低,将其调整并重启服务后问题暂时解决。然而,后续又出现接口响应慢的情况,通过监控工具发现堆内存分配不足,调整了JVM堆内存大小,进一步优化了应用性能。

最近上线的项目凌晨出现了下图异常
在这里插入图片描述
因为以前从没碰到过这种情况,首先怀疑是hikari链接池配置问题。最后配置修改如下:

spring.datasource.dynamic.datasource.master.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.dynamic.datasource.master.hikari.min-idle=5
spring.datasource.dynamic.datasource.master.hikari.max-pool-size=10
spring.datasource.dynamic.datasource.master.hikari.is-auto-commit=true
# 我的Hikari之前的配置问题是 idleTimeout+1>maxLifetime 会导致idleTimeout=0
spring.datasource.dynamic.datasource.master.hikari.idle-timeout=60000
spring.datasource.dynamic.datasource.master.hikari.pool-name=MasterHikariCP
spring.datasource.dynamic.datasource.master.hikari.max-lifetime=200000
spring.datasource.dynamic.datasource.master.hikari.initialization-fail-timeout=1000

但还是发现问题存在。下一步排查MySQL配置 show variables like '%timeout%';
在这里插入图片描述
什么鬼? 这玩意配置才900。。 这时我马上机灵的去修改MySQL配置。修改完之后重启查看正常了。(箭头指的两个地方都要在my.cnf中修改才能生效哦)
在这里插入图片描述
但第二天还是反应接口速度慢。这时候我找到了Arthas对线上项目进行监测,发现堆内存才分配了1G。。Oh my god !
在这里插入图片描述

垃圾回收次数gc.ps—scavenge.coun七、 垃圾回收消耗时间 gc.ps_scavenge.time、 标记-清除算法的次数gc.ps marksweep.count、 标记-清除算法的消耗时间gc.ps_marksweep.time。

下面是修改后的启动脚本。

#!/bin/bash 
#这里可替换为jar包名字
APP_NAME=szsti-word.jar
#根据实际情况修改参数 
JVM="-server -Xms5g -Xmx5g -Xss256k -XX:+UseG1GC -XX:ParallelGCThreads=8 -XX:+PrintGCDetails -Xloggc:/www/server/word/GC/wordGc.log 
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/www/server/word/GC/wordHead.log"
#APPFILE_PATH="-Dspring.config.location=/usr/local/config/application.properties"
#使用说明,用来提示输入参数 
usage() {
    echo "Usage: sh 执行脚本.sh [start|stop|restart|status|log|backup]" 
    exit 1
}
#检查程序是否在运行 
is_exist(){
    pid=`ps -ef|grep $APP_NAME|grep -v grep|awk '{print $2}' `
    #如果不存在返回1,存在返回0 
    if [ -z "${pid}" ]; then
        return 1
    else
        return 0
    fi
}

#启动方法 
start(){
    is_exist
    if [ $? -eq "0" ]; then
        echo "${APP_NAME} is already running. pid=${pid} ." 
    else
        #nohup java $JVM -jar $APPFILE_PATH $APP_NAME > /dev/null 2>&1 
                #后台启动jar包,且控制环境变量,根据实际情况修改吧。
        nohup java $JVM -jar $APP_NAME 2>&1 &
    fi
}

#停止方法 
stop(){ 
    is_exist 
    if [ $? -eq "0" ]; then 
        kill -9 $pid 
    else 
        echo "${APP_NAME} is not running" 
    fi 
}            
      
#输出运行状态 
status(){ 
    is_exist 
    if [ $? -eq "0" ]; then 
        echo "${APP_NAME} is running. Pid is ${pid}" 
    else 
        echo "${APP_NAME} is NOT running." 
    fi 
}   
#重启 
restart(){
    stop
    start
}

#日志
log(){
        # 输出实时日志
    tail -n 100 -f /www/server/word/fdc-server.log
}

#备份
backup(){
        #根据需求自定义备份文件路径。
    BACKUP_PATH=/www/server/word/bankup
        #获取当前时间作为备份文件名
    BACKUP_DATE=`date +"%Y%m%d(%H:%M:%S)"`
    echo 'backup file ->'$BACKUP_PATH$BACKUP_DATE'.jar'
        #备份当前jar包
    cp -r /www/server/word/$APP_NAME  $BACKUP_PATH$BACKUP_DATE'.jar'
}

#根据输入参数,选择执行对应方法,不输入则执行使用说明 
case "$1" in
    "start")
        start
        ;;
    "stop")
        stop
        ;;
    "status")
        status
        ;;
    "restart")
        restart
        ;;
    "log")
        log
        ;;
    "backup")
        backup
        ;;
    *)
usage
;;
esac

持续监测中。。。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值