我在windows server上部署了一个springboot的jar包。启动命令如下:
@echo off
javaw -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\heapdump.hprof -Dapp.name="largeSceen" -Dfile.encoding=utf-8 -Xms10240m -Xmx20480m -XX:MaxDirectMemorySize=4g -jar C:\Users\Administrator\Desktop\大屏项目\largeScreen-1.0.0.jar > server.log 2>&1
exit
jar包内部有application.yml, jar包外部同级目录也有application.yml来覆盖数据库连接。
昨天出现了一个问题,数据库宕机了一点时间,一直连不上。
今天查看前端,发现数据库连接到了内部的application.yml的数据库连接。
并且使用jps找不到java进程。
但是使用netstat -ano |findstr 11011(jar的端口) 可以找到进程
此外server.log 没有继续写入日志,内部的logback配置也没有生效,没有写入到app.log
请问这是什么原因?
应用程序可能在数据库宕机时出现了异常,但没有完全崩溃,这就是典型的"僵尸"状态。这种情况下,进程虽然还在运行(所以端口仍被占用),但实际上已经不再正常工作了。
当你的数据库恢复后,这个"僵尸"进程试图重新连接数据库,但因为它已经处于异常状态,可能回退到了使用jar包内部的配置而不是外部的覆盖配置。
核心在于:
可以参考一下方法解决:
tasklist /fi "pid eq 端口对应的PID"
taskkill /F /PID 对应的PID号
但是需要注意的是:为了防止将来再次发生这种情况,你可以:
这类问题在生产环境中很常见,特别是当依赖服务(如数据库)暂时不可用时。