必须用ojdbc11+Wallet,缺一不可;否则报ORA-12154或ORA-28759:Maven需声明com.oracle.database.jdbc:ojdbc11:23.7.0.24.07(runtime scope),Wallet须解压至绝对路径并用-Doracle.net.tns_admin指定,URL必须用TNS别名(如@myatp_high?TNS_ADMIN=...),驱动类名必须为oracle.jdbc.OracleDriver。

必须用 ojdbc11 + Wallet,缺一不可;否则直接报 ORA-12154 或 ORA-28759
ojdbc11 版本和依赖怎么配才不崩
Spring Boot 3.x / Java 17+ 项目连 Oracle Cloud(ATP/ADB)时,ojdbc11 不是可选项,而是强制要求。Maven 里必须显式声明:
<dependency> <groupId>com.oracle.database.jdbc</groupId> <artifactId>ojdbc11</artifactId> <version>23.7.0.24.07</version> <scope>runtime</scope> </dependency>
- 别用
ojdbc8:它不支持 Jakarta EE 9+,会抛NoClassDefFoundError: jakarta/xml/bind/JAXBException - 别漏
<scope>runtime</scope>:驱动类不该参与编译,只在运行时加载 - 别从非官网渠道下载 JAR:签名缺失会导致
SecurityException,Oracle Cloud 场景下尤其敏感
Wallet 文件怎么放、怎么读才生效
Oracle Cloud 数据库默认禁用密码直连,必须用 Wallet(即 wallet.zip)做 TLS 认证。光下载解压不够,JVM 还得“认得路”:
- 解压
wallet.zip到一个确定路径,比如/opt/oracle/wallet - 启动时加 JVM 参数:
-Doracle.net.tns_admin=/opt/oracle/wallet(不是环境变量TNS_ADMIN,JDBC Thin 驱动优先读系统属性) - 或代码里提前设置:
System.setProperty("oracle.net.tns_admin", "/opt/oracle/wallet"),且必须在DriverManager.getConnection()前执行 - 检查 wallet 目录下必须有
cwallet.sso、tnsnames.ora、sqlnet.ora三个文件,缺一个都连不上
连接 URL 写成什么样才能过 TLS 握手
不能沿用本地库的 @//host:port/service_name 格式——Cloud 环境下必须用 Wallet 内定义的 TNS 别名,URL 形如:
jdbc:oracle:thin:@myatp_high?TNS_ADMIN=/opt/oracle/wallet
-
myatp_high是tnsnames.ora里定义的 alias(不是 service_name),大小写敏感 - 必须带
?TNS_ADMIN=...参数,否则驱动不会去读你设的路径 - 绝对不要在 URL 里硬写 IP 或端口:Cloud 实例地址可能漂移,TNS 别名才具备 DNS 和负载均衡能力
- 如果报
Io exception: SSL Handshake failed,大概率是sqlnet.ora里SSL_SERVER_DN_MATCH=yes但证书 CN 不匹配,此时要确认 wallet 是否为当前数据库生成(重下一次最稳妥)
为什么连上了又查不了表?权限和字符集容易被忽略
Wallet 连通只是第一步。Oracle Cloud 默认用户(如 ADMIN)没有访问普通表的权限,且数据库字符集常为 AL32UTF8,而 JDBC 默认不声明编码:
- 建用户后必须显式授权:
GRANT CONNECT, RESOURCE TO myuser;+GRANT SELECT ON schema.table TO myuser; - 连接 URL 后追加参数避免中文乱码:
?useUnicode=true&characterEncoding=UTF-8(虽然 ojdbc11 实际忽略该参数,但保留无害;真正起效靠数据库端配置) - 首次连接超时常见于 Wallet 解密慢,建议加
connectTimeout=30000和socketTimeout=60000参数 - Spring Boot 用户注意:
spring.datasource.driver-class-name必须是oracle.jdbc.OracleDriver,oracle.jdbc.driver.OracleDriver在 ojdbc11 中已废弃
Wallet 路径、TNS 别名、驱动类名这三处错任何一处,都会静默失败或报看似网络问题的错误——实际根本没走到 TCP 层。



















