必须用ojdbc8,因其是唯一同时支持Oracle 19c新特性且兼容JDK 8–11的驱动;ojdbc6因方法缺失报错,ojdbc10因字节码版本不兼容在JDK 8下抛ClassFormatError。
为什么必须用 ojdbc8 而不是 ojdbc6 或 ojdbc10
oracle 19c 官方明确要求 jdk 8+,而 ojdbc8 是唯一同时满足「支持 oracle 19c 新特性(如 application continuity、sharding 元数据)」和「兼容 jdk 8–11」的驱动版本。用 ojdbc6 会报 java.lang.nosuchmethoderror: oracle.jdbc.driver.oracledriver.connect;用 ojdbc10 在 jdk 8 下直接 classformaterror——它编译目标是 jdk 10+ 字节码。
实操建议:
- 从 Oracle 官网下载
ojdbc8-19.21.0.0.jar(注意:不是ojdbc8-full.jar,那个含调试符号且体积大,生产环境不用) - Maven 项目请用中央仓库坐标:
com.oracle.database.jdbc:ojdbc8:19.21.0.0(Oracle 已同步到 Maven Central,无需额外配置私有仓库) - 若用 Spring Boot 2.5+,
spring-boot-starter-jdbc默认不带 Oracle 驱动,必须显式声明依赖,否则启动时报Failed to determine embedded database driver class
oracle.jdbc.driver.OracleDriver 已废弃,该用哪个类名
从 ojdbc6 开始,oracle.jdbc.driver.OracleDriver 就被标记为 @Deprecated;到 ojdbc8,它仍能工作但会打印警告日志;19c 文档明确推荐使用 oracle.jdbc.OracleDriver(注意包路径少了一个 driver)。Spring Boot 2.3+ 的 JdbcDataSourceBuilder 也默认尝试加载新类名。
实操建议:
- 手动注册驱动时写
Class.forName("oracle.jdbc.OracleDriver"),别抄旧教程里的老包名 - 如果用 HikariCP,
driver-class-name配置项必须设为oracle.jdbc.OracleDriver,否则连接池初始化失败,报Unable to load class: oracle.jdbc.driver.OracleDriver - Tomcat 的
context.xml中factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"不影响驱动类选择,但driverClassName同样要填新类名
URL 格式里要不要加 ?useSSL=false 这类 MySQL 风格参数
Oracle JDBC URL 没有 useSSL 参数。强行加上会导致解析失败,抛 java.sql.SQLException: Invalid connection string format。Oracle 的 SSL/TLS 控制靠独立属性,比如 oracle.net.ssl_server_dn_match=true,且只在启用 Wallet 或 TLS 时才需要。
实操建议:
- 标准 URL 格式为:
jdbc:oracle:thin:@//host:port/service_name(推荐)或jdbc:oracle:thin:@host:port:SID(仅限传统 SID,19c 默认用 service_name) - 连接 RAC 或使用 SCAN 地址时,URL 要写成:
jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=scan-host)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=myservice))),不能简单拼 host:port - 如果应用部署在容器中且 DNS 解析慢,加
oracle.net.disableOscar=true可跳过 Oracle 自动服务注册探测,避免连接超时
连接池里 validationQuery 设成 SELECT 1 FROM DUAL 会出问题吗
不会出错,但效率低。Oracle 的 DUAL 表虽小,但每次校验都触发一次完整 SQL 解析 + 执行计划生成。更优做法是用轻量级连接有效性检测机制——ojdbc8 支持 oracle.jdbc.thinOracleDriver.pingDatabase 底层调用,对应连接池参数是 connection-test-query(HikariCP)或 validationQuery(Druid),但值应设为 SELECT 1 FROM DUAL 之外的更高效方式。
实操建议:
- HikariCP 推荐关闭
connection-test-query,改用connection-init-sql=ALTER SESSION SET CURRENT_SCHEMA=YOUR_SCHEMA(顺便做 schema 切换),再配合keepalive-time=30000 - Druid 必须设
validationQuery=SELECT 1 FROM DUAL,但要把testOnBorrow改成testWhileIdle,并调大timeBetweenEvictionRunsMillis(如 60000),减少频次 - 无论哪种池,都要开启
oracle.jdbc.useFetchSizeWithLongColumn=true(防止 CLOB/BLOB 导致内存溢出),加在 URL 末尾或数据源属性里
19c 的 TNS 连接字符串解析、Wallet 加载、连接存活检测这些环节,稍有参数错位就会静默失败或延迟数秒才报错,配完务必用 telnet host 1521 和 tnsping SERVICE_NAME 先验证网络与监听层通路。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











