不能将 wallet 参数写入 spring.datasource.url,因为 oracle jdbc 驱动在 url 解析阶段会忽略 oracle.net.wallet_location 等参数,且 wallet 必须在驱动初始化早期加载,而 url 解析发生在 datasource 构建后期,导致加载窗口错过,引发 ora-28860 错误或降级为非 ssl 连接。

Spring Boot 项目里配 spring.datasource.hikari.data-source-properties.oracle.net.wallet_location 是唯一可靠方式;硬塞 wallet 参数到 spring.datasource.url 或指望 HikariCP 透传 Wallet 属性,都会失败。
为什么不能把 wallet 参数写进 spring.datasource.url?
Oracle JDBC 驱动在解析 URL 时会忽略 wallet 相关参数(如 ?oracle.net.wallet_location=/path),尤其当 URL 已含 @ 分隔的连接描述符时。更关键的是:Wallet 必须在驱动初始化早期加载,而 URL 解析发生在 DataSource 构建阶段——此时 Wallet 已错过加载窗口。
- 现象:连接抛
ORA-28860: SSL/TLS error或直接 fallback 到非 SSL 连接 - Spring Boot 2.7+ + HikariCP 默认不处理自定义 driver 属性,
data-source-properties是它唯一支持的透传通道 - 若同时设置了
javax.net.ssl.trustStore系统属性,驱动会直接忽略 wallet 并报错
怎么正确配置 oracle.net.wallet_location?
必须通过 HikariCP 的 data-source-properties 显式注入,且路径需指向包含 cwallet.sso 的目录(不是文件本身)。
- 在
application.properties中写:spring.datasource.hikari.data-source-properties.oracle.net.wallet_location=/opt/oracle/wallet
- 确保该路径下存在
cwallet.sso和ewallet.p12(自动登录 wallet 要求两者齐全) - Linux 下检查权限:
ls -l /opt/oracle/wallet/cwallet.sso—— 应为 owner 可读,其他用户不可读(600最安全) - Windows 用户注意路径分隔符用正斜杠或双反斜杠:
C:/oracle/wallet或C:\oracle\wallet
HikariCP 不转发 Wallet 属性,那还有别的办法吗?
有,但属于兜底方案:绕过 Spring Boot 自动配置,手动构造 HikariDataSource 并设置 addDataSourceProperty。
- 适用于需要动态切换 wallet 路径、或集成多租户 wallet 的场景
- 示例代码片段:
HikariConfig config = new HikariConfig(); config.setJdbcUrl("jdbc:oracle:thin:@tcps://adb.example.com:1522/adb123456789.us-phoenix-1.adb.oraclecloud.com"); config.addDataSourceProperty("oracle.net.wallet_location", "/opt/oracle/wallet"); config.setUsername("myuser"); config.setPassword("mypass"); // 注意:wallet 模式下密码仍需提供(用于数据库用户认证) return new HikariDataSource(config); - 此方式跳过 Spring Boot 的
DataSourceProperties绑定逻辑,完全由你控制属性注入时机
容易被忽略的关键点
Wallet 加载失败往往不是配置错,而是环境没对齐:
-
cwallet.sso文件名不能改,大小写敏感,且必须与ewallet.p12在同一目录 - Java 进程启动用户必须对 wallet 目录有读取权限 —— 容器部署时常见问题:镜像内用户 UID 与宿主机 wallet 权限不匹配
- Oracle 19c+ 要求 wallet 使用 AES256 加密,老版本
orapki创建的 wallet 可能不兼容 - Spring Boot 启动日志里搜
oracle.net.wallet_location,确认该属性确实被 HikariCP 接收到(不是静默丢弃)











