同一服务器上Spring Boot应用连接PostgreSQL启动卡顿问题
解决两个Spring Boot应用同时连接PostgreSQL不同数据库启动卡顿的问题
PostgreSQL本身完全支持同时为多个应用提供服务,连接不同数据库是标准场景,你遇到的后启动应用卡顿问题,大概率出在应用端配置或服务器资源限制上,以下是具体排查和解决步骤:
1. 检查应用Web端口冲突
从日志可见app2的Tomcat端口为8444,确认app1是否使用了相同的Web端口。如果两个应用端口重复,会导致后启动的应用无法正常绑定端口,出现启动卡顿。需确保两个应用的server.port配置不同,例如:
- app1:
server.port=8443 - app2:
server.port=8444
2. 优化数据库连接池配置
Spring Boot默认使用HikariCP连接池,不合理的连接池参数可能导致资源抢占。分别为两个应用配置合适的连接池参数:
# 以下参数可根据服务器资源调整,两个应用的连接池总和不要超过PostgreSQL的max_connections值 spring.datasource.hikari.maximum-pool-size=10 spring.datasource.hikari.connection-timeout=30000 spring.datasource.hikari.idle-timeout=600000 spring.datasource.hikari.max-lifetime=1800000
3. 检查PostgreSQL连接数限制
PostgreSQL默认最大连接数max_connections为100,若两个应用的连接池总和接近或超过这个值,会导致新连接无法建立。登录PostgreSQL服务器执行以下命令排查:
-- 查看当前活跃连接数 SELECT count(*) FROM pg_stat_activity; -- 查看当前最大连接数配置 SHOW max_connections;
若连接数不足,修改PostgreSQL配置文件postgresql.conf中的max_connections值(需根据服务器内存调整,每个连接约占用几MB内存),之后重启PostgreSQL服务。
4. 缓解服务器资源压力
从日志可知服务器是1核1GB内存,资源非常有限,两个Spring Boot应用+PostgreSQL同时运行易导致资源耗尽:
- 为每个应用设置JVM内存限制,启动时添加参数:
java -Xmx512m -Xms256m -jar app.jar,避免单个应用占用过多内存。 - 用
top或htop命令查看服务器CPU、内存占用率,若资源接近耗尽,需升级服务器配置。
5. 调整Hibernate初始化配置
后启动的应用卡在Hibernate方言加载阶段,可能是Schema验证/初始化耗时过长:
- 关闭不必要的DDL自动操作:
若需要表结构验证,可设置为spring.jpa.hibernate.ddl-auto=nonevalidate,避免自动创建/更新表的开销。 - 关闭Hibernate统计日志,减少初始化资源消耗:
spring.jpa.properties.hibernate.generate_statistics=false
6. 确认数据库用户权限
确保两个应用使用的数据库用户拥有对应数据库的完整访问权限,避免权限问题导致连接后卡住:
-- 为app1用户授权db1访问权限 GRANT ALL PRIVILEGES ON DATABASE db1 TO app1_user; -- 为app2用户授权db2访问权限 GRANT ALL PRIVILEGES ON DATABASE db2 TO app2_user;
内容的提问来源于stack exchange,提问作者green.it
相关产品推荐
相关产品推荐

