Ubuntu服务器启动SpringBoot服务时多Jar实例及多MySQL连接问题
多SpringBoot进程与MySQL连接异常的原因分析
可能的核心原因
1. Systemd服务配置失误
- 服务文件中
ExecStart重复定义,或使用了嵌套启动脚本(比如脚本里又调用了java -jar命令),导致多次触发jar启动 Restart参数配置不当(如Restart=always),若应用启动后因异常快速退出,systemd会不断重启进程,形成多个实例- 重复加载服务:同一服务文件在
/etc/systemd/system/和/lib/systemd/system/下同时存在,或多次执行systemctl enable导致重复启动
2. SpringBoot应用内部逻辑问题
- 代码中存在误操作,比如通过
Runtime.exec()或第三方库意外启动自身jar包进程 - 配置文件错误开启多实例模式,或集群配置未正确设置实例标识,导致应用启动时自动生成多个实例
3. 数据库连接池的正常/异常情况
- 正常情况:SpringBoot默认使用HikariCP连接池,会预先创建
minimum-idle数量的连接,并根据请求动态扩容至maximum-pool-size,这些连接属于同一应用实例的连接池,是正常行为 - 异常情况:若连接数远超配置的最大池大小,大概率是代码存在连接泄漏(比如未关闭数据库连接、事务未提交/回滚导致连接未释放)
4. Hostinger VPS环境的特殊因素
- VPS自带的监控工具可能会自动重启标记为异常的进程,若应用启动后短暂崩溃,会被重复拉起
- 服务器的cron任务中存在定期启动该jar的脚本,导致定时生成新实例
快速排查步骤
- 查看服务状态:
systemctl status [你的服务名],确认服务的启动次数和当前运行实例 - 检查服务文件:
cat /etc/systemd/system/[你的服务名].service,重点核对ExecStart、Restart、Type(推荐Type=simple)配置 - 查看应用日志:检查SpringBoot日志,看是否有重复启动的日志条目,或连接池相关的错误信息
- 排查数据库连接:登录MySQL执行
show processlist;,查看连接的来源进程ID,确认是单实例连接池还是多实例的连接 - 检查代码逻辑:排查是否存在主动启动新进程的代码,或连接池配置是否符合预期
内容的提问来源于stack exchange,提问作者Mahesh Gunasekara
相关产品推荐
相关产品推荐

