JDBC连接Docker部署的PostgreSQL失败:密码错误(SQLState 28P01)求助
PostgreSQL连接报错SQLState 28P01(密码错误)排查方案
1. 清理Docker数据卷缓存
你配置了本地目录作为PostgreSQL的数据卷,第一次启动容器时PostgreSQL会初始化用户和密码并写入卷中。之后即使修改docker-compose.yml里的密码,卷中的旧数据依然保留,导致密码不匹配。
操作步骤:
- 停止并删除容器:
docker-compose down - 删除本地数据卷目录:
rm -rf ./src/main/resources/volume - 重新启动容器:
docker-compose up -d
2. 验证配置文件读取是否正确
有可能PropertiesUtil没有正确读取application.properties中的密码,导致传递了错误值给JDBC连接。
在MigrationUtil中临时添加日志,打印读取到的配置值:
public static void migrateDB(){ Properties properties = PropertiesUtil.getApplicationProperties(); // 临时打印配置,确认读取是否正确 System.out.println("读取的用户名: " + properties.getProperty("username")); System.out.println("读取的密码: " + properties.getProperty("password")); try (Connection connection = DriverManager.getConnection( properties.getProperty("url"), properties.getProperty("username"), properties.getProperty("password"))) { System.out.println(connection.getSchema()); }catch (SQLException e){ System.out.println(e.getMessage()); } }
运行后确认输出的用户名和密码是否与application.properties一致,如果不一致:
- 检查
application.properties是否放在src/main/resources目录下(确保在classpath中) - 检查文件名是否拼写正确(比如有没有写成
application.properites) - 检查文件编码是否为UTF-8,有没有特殊字符混入
3. 添加JDBC URL的SSL禁用参数
新版PostgreSQL默认可能强制要求SSL连接,而本地容器未配置SSL时,连接异常可能被误导为密码错误。
修改application.properties中的URL:
url=jdbc:postgresql://localhost:5432/monitorService?sslmode=disable
4. 验证容器内的用户密码有效性
进入PostgreSQL容器,直接验证用户密码是否正确:
- 查看容器ID:
docker ps - 进入容器:
docker exec -it <你的容器ID> bash - 用指定用户登录数据库:
psql -U username -d monitorService- 如果能成功登录,说明容器内的用户密码是正确的,问题出在Java代码或配置读取环节
- 如果登录失败,说明容器初始化时密码未正确设置,需要重新清理数据卷后启动
内容的提问来源于stack exchange,提问作者swatter
相关产品推荐
相关产品推荐

