Oracle JDBC 常见问题解答 (FAQ)

本常见问题解答提供关于 Oracle JDBC 驱动程序的常见问题解答。请注意,本常见问题解答仅解答特定技术问题,并涵盖已知问题。有关这些特性以及如何在应用中使用这些特性的更多详细信息,请参阅《JDBC 开发人员指南》和 JDBC 的 Javadoc。


常见问题解答

    • 26ai 有哪些新特性?
    • 有哪些面向 Java 开发人员的 Oracle Database Cloud Service 文档?

JDBC 常见问题

版本特定问题

    • Oracle 数据库支持哪些版本的 JDBC 驱动程序?

版本

GA 日期

标准支持终止日期

扩展支持终止日期

持续支持终止日期

26ai 2026 年 1 月
  • 2031 年 12 月
2031 年 12 月 未定义
21c(创新版本) 2021 年 8 月 2027 年 7 月 不适用 未定义
19c(长期发行版本) 2019 年 4 月 2029 年 12 月(请参阅 Lifetime Support Policy) 2032 年 12 月 未定义
18c 2018 年 7 月 2021 年 6 月 不适用 未定义
12.2 2017 年 3 月 2020 年 11 月 30 日(针对 12.2.0.1 的有限错误更正期限:2020 年 12 月 1 日至 2022 年 3 月 31 日) 不适用 未定义
EE 12.1 2013 年 6 月 2018 年 7 月 2022 年 7 月 未定义

    • 什么是 JDBC 和 RDBMS 互操作性矩阵或认证矩阵?

互操作性矩阵

Database 23.x

Database 21.x

Database 19.x

Database 18.3

Database 12.2 和 12.1

JDBC 23.x
JDBC 21.x 曾经支持 曾经支持
JDBC 19.x 曾经支持 曾经支持
JDBC 18.x 曾经支持 曾经支持 曾经支持 曾经支持
JDBC 12.2 和 12.1 曾经支持 曾经支持 曾经支持 曾经支持

    • 各个版本的 Oracle JDBC 分别支持哪些版本的 JDK?

Oracle Database 版本

特定于 JDK 版本的 JDBC Jar 文件

23.x

ojdbc17.jar  兼容 JDK17、JDK19、JDK21 和 JDK25,并支持 Jakarta API


ojdbc11.jar 兼容 JDK11 和 JDK21


ojdbc8.jar 兼容 JDK8 和 JDK11

21.x

ojdbc11.jar 兼容 JDK11、JDK17、JDK19 和 JDK21


ojdbc8.jar 兼容 JDK8 和 JDK11

19.x

ojdbc10.jar 兼容 JDK11、JDK17、JDK19 和 JDK21(19.25 及更高版本)


ojdbc8.jar 兼容 JDK8、JDK11、JDK17、JDK19 和 JDK21(19.25 及更高版本)

18.x ojdbc8.jar 兼容 JDK8 和 JDK11
12.2 或 12cR2 ojdbc8.jar 兼容 JDK 8
12.1 或 12cR1

ojdbc7.jar 兼容 JDK 7 和 JDK 8


ojdbc6.jar 兼容 JDK 6

11.2 或 11gR2

ojdbc6.jar 兼容 JDK 6、JDK 7 和 JDK 8


(注意:仅 11.2.0.3 和 11.2.0.4 支持 JDK7 和 JDK8)


ojdbc5.jar 兼容 JDK 5

    • 各个版本的 Oracle JDBC 分别遵循哪些 JDBC 规范?

Oracle Database 版本

JDBC 规范合规性

23.x 和 21.x

ojdbc11.jar 遵循 JDBC 4.3 规范


ojdbc8.jar 遵循 JDBC 4.2 规范

19.x

ojdbc10.jar 遵循 JDBC 4.3 规范


ojdbc8.jar 遵循 JDBC 4.2 规范

18.3 ojdbc8.jar 遵循 JDBC 4.2 规范
12.2 或 12cR2 ojdbc8.jar 遵循 JDBC 4.2 规范
12.1 或 12cR1

ojdbc7.jar 遵循 JDBC 4.1 规范


ojdbc6.jar 遵循 JDBC 4.0 规范

11.2 或 11gR2

ojdbc6.jar 遵循 JDBC 4.0 规范


ojdbc5.jar 遵循 JDBC 3.0 规范

其他版本特定问题

    • Oracle JDBC 驱动程序是否通过了 OpenJDK 认证?
    • 对于 JDK11,Oracle Database 19.x 适合使用哪些 JDBC 驱动程序?
    • 如何使用上表所示以外版本的 JDBC?
    • 如何获取 JDBC Jar 文件?
    • Oracle Database 19.x JDBC 驱动程序下载页面都提供哪些 Jar 文件?

Oracle JDBC 常见问题

    • Oracle 都提供哪些 JDBC 驱动程序?
    • 我应该使用哪种驱动程序?
    • 服务器端 Thin 驱动程序和服务器内部驱动程序需要使用哪些 Jar 文件?
    • 第三方提供商能否在分发自家软件时一同分发 Oracle JDBC 驱动程序?
    • Oracle JDBC 驱动程序需要哪些权限?

安装

    • 如何安装 Thin 驱动程序?
    • 如何安装 OCI 驱动程序?
    • 如何安装服务器端内部驱动程序或 Thin 服务器内部驱动程序?

DriverManager 和 DataSource

    • DriverManager 与 DataSource 有何区别?
    • 我应该使用哪种连接池?
    • 什么是 JDBC OCIConnectionPool?

连接

    • URL 的格式是什么?
    • 数据库描述的格式是什么?
    • 如何使用 Properties 参数?
    • 不需要向 DriverManager 注册 OracleDriver 类吗?
    • 连接服务器内部驱动程序时,我应该使用什么用户名和密码?
    • 我在设置了一个较高的默认预取值时发生了 OutofMemory 错误,怎么办?
    • 什么是服务连接字符串?
    • 如何以 SYSDBA 或 SYSOPER 身份连接?
    • Oracle JDBC 驱动程序支持哪些加密方法?
    • 使用 Thin 驱动程序时,如何启用加密和校验和验证?
    • 什么是代理身份验证?
    • Oracle JDBC 驱动程序是否支持 SSL?
    • Oracle JDBC 驱动程序是否在连接 URL 中提供 LDAP 支持?
    • 如何使用 JDBC 连接位于防火墙后方的数据库服务器?
  • Statement、PreparedStatement 和 CallableStatement

    • 什么是 defineColumnType?我应当何时使用?
    • defineColumnType 是否会在服务器上强制执行转换操作?
    • 如何在 JDBC 驱动程序层面关闭 EscapeProcessing,而不是在应用代码中调用 stmt.setEscapeProcessing (false)?
    • Oracle JDBC 驱动程序是否提供 Bind by Name(按名称绑定)工具?
    • 对于 PreparedStatement 中的 setXXX 方法,Oracle JDBC 驱动程序如何确定数据类型?
    • 如果目标参数的类型与 setXXX 方法预设的类型不一致,会怎么样?
    • 驱动程序为何不在客户端侧执行转换?
    • 当在表中插入列时,应当使用哪种字节数据类型?
    • 在表中插入列时,应使用哪种字符数据类型?
    • setString、setCharacterStream 和 setAsciiStream 的大小是多少?通过 setBytes 和 setBinaryStream 处理二进制数据时的大小限制是多少?

格式

Stmt

驱动程序

下限

上限

绑定机制

备注

所有 所有 所有 0 0 Null
所有 SQL 客户端 1 个字符 32766 个字符 直接
所有 SQL 客户端 32767 个字符 2147483647 字节
所有 SQL 客户端 2147483648 字节 2147483647 个字符

临时 Clob


CHAR  
服务器 1 个字符 65536 字节

直接


1, 2


NCHAR  
 
1 个字符 4000 字节

直接


NCHAR  
 
4001 字节 2147483647 个字符

临时 Clob


CHAR  
 
65537 字节 2147483647 个字符


 
 
 
2147483647 字节 2147483647 个字符

临时 Clob


所有 PL/SQL 所有 1 个字符 32512 个字符 直接  
所有 PL/SQL 所有 32512 个字符 2147483647 个字符 临时 Clob

    • oracle.jdbc.OraclePreparedStatement 中的专用方法 setBytesForBlob、setStringForClob 有何长度限制?

API

格式

Stmt

驱动程序

下限

上限

绑定机制

注意

setBytesForBlob

n/a


所有 所有

0


0


Null
 
 
所有 客户端 1 字节

2000 字节


直接
 
 
所有 客户端 2001 字节 21474836487 字节 临时 blob 2
setStringForClob

所有


所有 所有 0 0 Null  
 

所有


所有 客户端 1 个字符 32766 个字符 直接  
 

所有


所有 客户端 32766 个字符 2147483647 个字符 临时 Clob  
 

所有


所有 服务器 1 个字符 4000 字节 直接  
 

所有


所有 服务器 4001 字节 2147483647 个字符 临时 Clob 1

    • 切换绑定类型是否会强制执行额外的服务器端语句解析?
    • 如何在 CallableStatements 和程序中使用 IN OUT 参数?
    • 当绑定类型发生变更时,多态 PL/SQL 程序的选择是否会改变?
    • 现有代码是否会改变?
    • 某些情况下,驱动程序会创建临时 lob,驱动程序是否会跟踪并释放这些 lob?
    • 我们使用可变宽度字符集(如 UTF8),驱动程序是否会按照字符序列的实际字节长度进行更正?
    • 是否应使用 setString 等来创建超长字符串?
    • LONG RAW 和 LONG 列类型已经弃用,为什么还要使用 setXXXStream API?
    • LOB API 更加灵活,对吗?
    • 为什么我无法创建一个 PreparedStatement 来执行 select * from tab where id in (?, ?, ?, ...)?

ResultSet

    • "Exhausted Resultset: prepare_for_new_get" 是什么意思?
    • 为什么我必须关闭 ResultSet?

基本数据类型

    • DATE 和 TIMESTAMP 有何区别?
    • 我可以绑定的最长值是多少?

方法

列类型

最大长度

setBytes LONG

4k 字节


setBytes LONG RAW

2G 字节


setString LONG

32k 字符(SetBigStringTryClob="false")
4k 字符 (SetBigStringTryClob="true")


setString

CLOB


2G 字符


    • 为什么读取 TIMESTAMP WITH TIME ZONE 会出现不同的结果?

高级数据类型(对象)

    • 如何创建 ADT 实例?
    • 为什么不支持标准工厂方法 createArrayOf supported?

BFILE、BLOB、CLOB

    • DBMS_LOB.ERASE 有何作用?
    • 我可以使用 oracle.sql.CLOB.putChars() 吗?
    • OCI 提供函数来操作 CLOB CharSetId,在这方面 JDBC 提供了什么?
    • 写入到 BLOB 的速度是否比 LONG RAW 慢?
    • 在 Stream 示例代码中获取 LobLength 时,为什么会出现 ORA-03127 错误?
    • 从数据库获取 CLOB 并更新,有时我的更改不会显示在数据库中,为什么?

REF 类型

    • 如何在两个 JDBC 客户端(EJB 客户端、JDBC 客户端等)之间传递 oracle.sql.REF?REF 类不支持序列化吗?
    • 如何创建一个新 REF?

OPAQUE 类型

    • 什么是 OPAQUE 类型?

行源

    • 我设置了执行完毕可滚动属性,但却对 RowSet 的可滚动性不起作用,为什么?
    • 我是否可以在 RowSet 包含流的情况下将 RowSet 对象序列化为平面文件?

Thin 驱动程序

    • Thin JDBC 驱动程序是否可用于开发 Java 应用?

服务器内部驱动程序

    • 何时应使用服务器内部驱动程序?

服务器 Thin 驱动程序

    • 何时应使用服务器 Thin 驱动程序?

错误

    • DriverManager.getConnection 报错:"No suitable driver"
    • 错误信息:"UnsatisfiedLinkError with OCI driver"
    • 错误信息:"ORA-1019: unable to allocate memory."
    • 错误信息:"ORA-01000: maximum open cursors exceeded"
    • 错误信息:"ORA-01002: fetch out of sequence"
    • 错误信息:"ORA-12705: invalid or unknown NLS parameter value specified"
    • 对于 Error ORA-12705,尝试检索文本时报错。
    • 错误信息:JDBC Thin 驱动程序提示 Unicode 文字出现“无效字符”错误
    • INSERT 或 UPDATE 操作缓慢
    • 错误信息:"Connection reset by peer"
    • “违反协议”是什么意思?

演示程序

    • JDBC 是否提供演示程序?
    • 如何运行演示程序?
    • 如果运行演示程序时发生错误,我该怎么做?

Oracle JDBC 跟踪工具

    • 什么是 JDBC 跟踪工具?
    • 如何打开旧版本 JDBC 跟踪工具?
    • 如何控制跟踪的输出量?
    • 跟踪输出的目的地是哪里?
    • 如何在启用 DMS 的 Jar 中关闭 DMS?

开发工具和环境

    • 是否可以使用 Symantec Visual Cafe 来调试 JDBC 程序?
    • 是否可以使用 Microsoft's Visual J++ 来调试 JDBC 程序?

支持的特性

    • JDBC 驱动程序是否可以访问 PL/SQL 存储过程?
    • JDBC 驱动程序是否支持流处理?
    • JDBC 驱动程序是否支持多字节字符集?
    • JDBC 驱动程序是否与防火墙兼容?
    • Oracle JDBC 驱动程序是否支持 PL/SQL 表/结果集/记录/布尔值?
    • 是否支持故障转移?
    • JDBC 驱动程序如何支持 Oracle ROWID 数据类型?getCursorName 和 setCursorName 呢?
    • JDBC 驱动程序如何支持 Oracle REFCURSOR 数据类型?
    • JDBC 驱动程序是否支持 ANO?
    • 我能否将 oracle.sql.* 数据类型序列化?
    • JDBC 驱动程序是否支持对象或集合?
    • 我是否可以使用 WaitOption 和 AutoRollback?
    • 一个数据库实例中的 Java 存储过程是否可以打开面向其他数据库实例的连接?

性能

    • Thin 驱动程序和 OCI 驱动程序哪个速度更快?
    • Statement 和 PreparedStatement 哪个速度更快?

java.util.logging

    • 如何使用 java.util.logging 从 Oracle JDBC 驱动程序获取跟踪输出?
    • 如何配置 java.util.logging,从 Oracle JDBC 获取有用的跟踪输出?
    • 如何配置 java.util.logging,从服务器端内部驱动程序获取有用的跟踪输出??

注:为免疑义,本网页所用以下术语专指以下含义:

  1. 除Oracle隐私政策外,本网站中提及的“Oracle”专指Oracle境外公司而非甲骨文中国。
  2. 相关Cloud或云术语均指代Oracle境外公司提供的云技术或其解决方案。