ORA-28001错误表示密码已过期,需DBA执行ALTER USER IDENTIFIED BY重置密码以清除过期状态,仅解锁或改profile无效;JDBC连接需高权限账户执行改密并主动清理旧连接池。

Oracle JDBC连接时密码过期会报什么错
Java应用连Oracle时如果密码过期,SQLException 的 SQLState 通常是 72000,错误码为 ORA-28001(密码已过期)或 ORA-28002(密码将在 N 天内过期)。部分驱动版本还会抛出 ORA-01017(用户名/密码无效),但实际是密码策略触发的强制修改流程,不是凭据错误。
用ALTER USER语句在JDBC中改密码的前提条件
必须用具有 ALTER USER 权限的账户(如 DBA 角色或显式授权)建立初始连接;目标用户不能被锁定(ACCOUNT_STATUS = 'OPEN');且 Oracle 密码策略未禁止通过 SQL 修改(例如 PASSWORD_LIFE_TIME 为 UNLIMITED 时仍可改,但 PASSWORD_REUSE_MAX 可能拒绝重复密码)。
实操建议:
- 先用 DBA 账户连上,查状态:
SELECT USERNAME, ACCOUNT_STATUS, EXPIRY_DATE FROM DBA_USERS WHERE USERNAME = 'YOUR_USER';
- 执行改密:
ALTER USER your_user IDENTIFIED BY "NewPass123!";
- 注意双引号包裹密码——若含特殊字符或大小写敏感,不加引号可能被转成大写或解析失败
- JDBC 中执行该语句需用
Connection.createStatement(),不能走预编译(PreparedStatement不支持 DDL)
Java里调用Oracle内置存储过程 dbms_password_management 是否可行
不可行。Oracle 官方并未提供名为 dbms_password_management 的标准包;常见混淆来源是误记 dbms_random 或第三方封装。真正用于密码轮换的是 ALTER USER ... IDENTIFIED BY 或通过 Oracle Wallet 管理凭据,而非系统存储过程。
立即学习“Java免费学习笔记(深入)”;
容易踩的坑:
- 试图调用不存在的
dbms_password_management.change_password,结果报ORA-06576: not a valid procedure or function name - 用普通应用账户连库后直接执行
ALTER USER,报ORA-01031: insufficient privileges - 改密后没重置连接池里的旧连接,导致后续请求仍用过期密码重连失败
连接池(如 HikariCP)中如何安全轮换密码
不能只改数据库密码,必须同步更新连接池配置并触发连接重建。Oracle 自身不支持运行时“热更新”密码,所以得靠连接池配合。
关键步骤:
- 先用 DBA 连接执行
ALTER USER更新密码 - 调用连接池的
evictAllConnections()(HikariCP)或close()+ 重建实例(推荐) - 避免用
setPassword()动态改配置——HikariCP 的password是只读属性,运行时修改无效 - 生产环境建议配合配置中心(如 Apollo、Nacos),监听密码变更事件后 reload 数据源 Bean
复杂点在于:密码轮换窗口期可能出现部分连接用旧密码、部分用新密码,导致短暂 500 错误。最稳的方式是停写、切流、批量改密、清空连接池、再放开流量。


















