spring boot 3 连接 oracle 21c 必须使用 ojdbc11(如 oracle.jdbc:ojdbc11:21.12.0.0),因其支持 jdbc 4.3 和 jakarta ee 9+,而 ojdbc8 因缺失 jaxb 类或驱动类废弃会导致 noclassdeffounderror 或 no suitable driver found;url 必须用 jdbc:oracle:thin:@//host:port/service_name 格式,driver-class-name 必须设为 oracle.jdbc.oracledriver。

ojdbc11 是 Oracle 21c 及 Spring Boot 3 的硬性依赖
Spring Boot 3 默认要求 JDK 17+,而 Oracle 21c 仅支持 JDBC 4.3(对应 Java 11+),ojdbc8 在运行时会因缺失 jakarta.xml.bind.JAXBException 或废弃类抛出 NoClassDefFoundError。必须用 ojdbc11,例如:oracle.jdbc:ojdbc11:21.12.0.0 或更高版本。
常见错误现象:
- 启动时报
Failed to configure a DataSource,但日志里没明确驱动加载失败 -
DriverManager.getConnection()抛No suitable driver found - Maven 里声明了
ojdbc8,却在配置里写oracle.jdbc.driver.OracleDriver—— 这个类在ojdbc11中已彻底废弃
正确做法:
- 显式声明
<groupid>oracle.jdbc</groupid><artifactid>ojdbc11</artifactid>,别依赖 starter 间接拉入旧驱动 - 若项目中已有其他 starter(如
spring-boot-starter-data-jpa)偷偷带入ojdbc8,需用<exclusions></exclusions>排除 - 内网无公网时,手动把
ojdbc11.jar放进lib/,并在 pom 中用<scope>system</scope>+<systempath></systempath>指向它 —— 仅限临时调试
URL 格式必须匹配 Oracle 版本和服务名类型
Oracle 不是 MySQL,jdbc:oracle:thin:@host:port/dbname 这种写法必然失败。格式错直接导致 IO Error: The Network Adapter could not establish the connection 或 Listener refused the connection。
关键区别:
- Oracle 11g/12c 传统部署常用 SID:用冒号结尾,例如
jdbc:oracle:thin:@192.168.1.100:1521:orcl - Oracle 12c+(尤其 19c/21c)默认启用多租户,服务名(SERVICE_NAME)才是标准,必须用斜杠,例如
jdbc:oracle:thin:@//192.168.1.100:1521/FREEPDB1(注意双斜杠//) - 复杂环境(RAC、防火墙、非默认端口)必须用完整描述符:
jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.7.88)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=orcl))),其中SERVICE_NAME或SID必须和 DBA 提供的tnsnames.ora一致
driver-class-name 和 Hibernate 方言必须同步升级
ojdbc11 不再注册旧的 oracle.jdbc.driver.OracleDriver,强行配置会导致连接池初始化失败。同时,Spring Boot 3 默认的 OracleDialect 只支持 19c+,连 12c 或 11g 会刷屏 HHH000511 警告,count 查询可能返回 null。
实操要点:
-
spring.datasource.driver-class-name必须设为oracle.jdbc.OracleDriver(注意包路径,不是driver子包) - 若连的是 Oracle 12c 或 11g,Hibernate 6 需切换方言:
spring.jpa.properties.hibernate.dialect=org.hibernate.community.dialect.OracleLegacyDialect - 必须引入社区方言依赖:
org.hibernate.orm:hibernate-community-dialects:6.6.4.Final(或更高兼容版) - 不要手动设置
hibernate.dialect,否则 Hibernate 6 会警告HHH90000025并忽略自动推导
虚拟机或 Docker 环境下网络连通性常被忽略
本地能连,但 Spring Boot 应用跑在 Docker 或 IDEA 内置 JVM 里连不上虚拟机 Oracle,90% 是网络层问题,不是配置问题。
排查步骤:
- 确认虚拟机 Oracle 监听地址不是
localhost或127.0.0.1—— 查lsnrctl status输出里的Listening Endpoints Summary...,确保绑定的是0.0.0.0:1521或具体 IP - 宿主机 ping 得通虚拟机 IP,不代表端口开放:用
telnet 192.168.x.x 1521或nc -zv 192.168.x.x 1521测试端口可达性 - Linux 虚拟机防火墙(
firewalld或iptables)默认拦 1521,需放行:sudo firewall-cmd --add-port=1521/tcp --permanent - Docker 容器内访问宿主机虚拟机,不能用
localhost—— 要用宿主机真实 IP(如10.0.2.2在 VirtualBox,默认网关)
最易被跳过的点:Oracle 实例启动后,监听未必自动加载;执行 lsnrctl start 手动启监听,比反复改配置更有效。











