Oracle JDBC 驱动程序

简介: 开始使用 Oracle JDBC 驱动程序 (Doc ID 1602866.1

Oracle JDBC 版本有哪些?
Oracle JDBC 驱动程序随 Oracle 数据库服务器一起提供。
从 9.2.0.1 这个数据库版本开始,Oracle JDBC 驱动程序版本包括:

JDBC 9.2.0.X
JDBC 10.1.0.X
JDBC 10.2.0.X
JDBC 11.1.0.X
JDBC 11.2.0.X
JDBC 12.1.0.X
JDBC 12.2.0.x
JDBC 18C
JDBC 19C
JDBC 21C
现在支持的 JDBC 驱动的版本是 : 21C, 18C,19C,12.2。

12.1 和其他版本的支持策略请参考 Oracle Lifetime Support Policy

主要的 Oracle JDBC 驱动程序 Java 类库有哪些?
要包括在应用程序的 CLASSPATH 中的基本 Java 库为ojdbc11.jar, ojbec10.jar、 ojdbc8.jar、ojdbc7.jar、ojdbc6.jar、ojdbc5.jar、ojdbc14.jar 或 classes12.jar。

                    请注意,在一些版本中JDBC支持多个JDK的版本(具体请参考“JDBC 驱动程序版本匹配哪个 JDK 版本的章节”的内容)   

ojdbc11.jar

                           将 JDBC Thin 和 OCI 客户端驱动程序用于 Java 10.0 VM 时所对应的 Java 类。

ojdbc10.jar

                          将 JDBC Thin 和 OCI 客户端驱动程序用于 Java 10.0 VM 时所对应的 Java 类。

ojdbc8.jar
将 JDBC Thin 和 OCI 客户端驱动程序用于 Java 8.0 VM 时所对应的 Java 类。
ojdbc7.jar
将 JDBC Thin 和 OCI 客户端驱动程序用于 Java 7.0 VM 时所对应的 Java 类。
ojdbc6.jar
将 JDBC Thin 和 OCI 客户端驱动程序用于 Java 6.0 VM 时所对应的 Java 类。
ojdbc5.jar
将 JDBC Thin 和 OCI 客户端驱动程序用于 Java 5.0 VM 时所对应的 Java 类。
ojdbc14.jar
将 JDBC Thin 和 OCI 客户端驱动程序用于 Java 1.4 或 5.0 VM 时所对应的 Java 类。使用 Java 5.0 VM 时,如果 JDBC 版本为 10.2,则可使用该库。
classes12.jar
除了使用 Java 1.2 或 1.3 VM 之外,其余与 ojdbc14.jar 相同。
classes12.zip
除了采用 zip 格式之外,其余与 classes12.jar 相同。该文件在未来版本中几乎肯定不可用。您应该转而使用 classes12.jar。
如果应用程序正使用高级数据类型(对象),则应用程序 CLASSPATH 中必须添加 nls_charset12.jar 或 orai18n.jar 库。

nls_charset12.jar
当使用 Java 1.2、1.3 或 1.4 VM 时,高级数据类型(对象)中支持所有 Oracle 字符集的类。但不适用用于 Oracle 10.1.0 和更高版本。您应该转而使用 orai18n.jar。
nls_charset12.zip
除了采用 zip 格式之外,其余与 nls_charset12.jar 相同。
orai18n.jar
与 nls_charset12.jar 相同,但用于 Oracle 10.1.0 和更高版本。orai18n.jar 库不作为 JDBC 驱动程序的一部分提供,而是位于 [ORACLE_HOME]/jlib。该库位于 JDBC 下载页。
如果您的应用使用 SQL/XML 数据库数据类型,则需要在CLASSPATH中加入 java.sql.SQLXML, xdb6.jar 类库。

xdb6.jar
支持标准JDBC 4.x java.sql.SQLXML 接口(Java SE 6 & Java SE 7)的类。
什么是 JDBC OCI 本地共享库?
本地 JDBC OCI 库:

在 Unix 上为 libocijdbc.so
在 Windows 上为 ocijdbc.dll (Windows)
其中

对于 JDBC 9.x.x 驱动程序,N 等于 9
对于 JDBC 10.x.x 驱动程序,N 等于 10
对于 JDBC 11.x.x 驱动程序,N 等于 11
对于 JDBC 12.x.x 驱动程序,N 等于 12
对于 JDBC 18.x.x 驱动程序,N 等于 18
对于 JDBC 19.x.x 驱动程序,N 等于 19
对于 JDBC 21.x.x 驱动程序,N 等于 21
该共享库将调用 OCI 接口来访问数据库。因此,当使用 JDBC OCI 驱动程序时,必须通过 Windows 环境变量 PATH 或 Solaris 的 LD_LIBRARY_PATH 查找 JDBC 共享库。
OCI 共享库还应与用于托管 Java 程序的 JVM 类型相匹配。因此,32 位(或 64 位)JVM 需要 32 位(或 64 位)OCI 共享库。

哪个 JDBC 驱动程序版本匹配哪个 JDK 版本?
在 JDBC FAQ on Oracle Technology Network (OTN) 中,OCI 或 Thin JDBC 驱动程序版本支持以下 java程序的 JDK 版本:

JDBC 版本 JDK 版本 JDBC 文件名
21c 8.x
11.x
12.x
13.x
14.x
15.x
17.x

ojdbc8.jar
ojdbc8.jar, ojdbc11.jar
ojdbc8.jar, ojdbc11.jar
ojdbc8.jar, ojdbc11.jar
ojdbc8.jar, ojdbc11.jar
ojdbc11.jar

19c 8.x
9.x
10.x
11.x ojdbc8.jar
ojdbc8.jar
ojdbc10.jar

   ojdbc10.jar***

18c 8.x
9.x
10.x
11.x ojdbc8.jar
12.2.0 8.x ojdbc8.jar
12.1.0
8.x
7.x
6.x

ojdbc7.jar
ojdbc7.jar
ojdbc6.jar
11.2.0

8.x **

7.x **
6.x
5.x

ojdbc6.jar
ojdbc6.jar
ojdbc6.jar
ojdbc5.jar
11.1.0 6.x
5.x ojdbc6.jar
ojdbc5.jar
10.2.0
1.2.x
1.3.x
1.4.x
1.5.x

classes12.jar
classes12.jar
ojdbc14.jar
ojdbc14.jar

10.1.0

1.2.x
1.3.x
1.4.x

classes12.jar
classes12.jar
ojdbc14.jar

9.2.0
1.1.x
1.2.x
1.3.x
1.4.x

classes111.zip*
classes12.zip*
classes12.zip*
ojdbc14.jar

在版本 9.2.0.7.0 中,这些 ZIP 文件被 JAR 文件替换。

** 仅 Oracle JDBC 驱动程序 11.2.0.3 (及更高)版本支持 JDK 7 and JDK 8。

示例:

  • 如果 JDK 版本为 6.0.x,则对于 11.2 JDBC 版本,使用的 JDBC 库为 ojdbc6.jar 文件。
  • 如果 JDK 版本为 5.0.x,则对于 10.2 JDBC 版本,使用的 JDBC 库为 ojdbc14.jar 文件。

* 19.3 版本:

(a) ojdbc8.jar (兼容 JDK8 (JDBC 4.2) 和 with JDK9, JDK11)

(b) ojdbc10.jar (兼容 JDK10 (JDBC 4.3) 和 JDK11).

如果你使用JDK11,ojdbc8.jar 仍然是你最好的选择,他包括所有的jdbc4.3的功能,并且Oracle还继续支持。ojdbc10.jar只在Java标准版本上能使用JDBC 4.3的功能。

例如:

ojdbc8.jar:

Connection conn = DriverManager.getConnection(. . .); // conn.beginRequest(); beginRequest在Java 8中没有,所以会失败
((OracleConnection)conn).beginRequest(); // 由于Oracle 的扩展提供了beginRequest,所以会成功

ojdbc10.jar:

Connection conn = DriverManager.getConnection(. . .); conn.beginRequest(); // 因为在Java 10中有beginRequest,所以会成功
((OracleConnection)conn).beginRequest(); // 会成功,因为OracleConnection支持JDBC 4.3(在Java10包含)以及beginRequest 是JDBC 4.3的一部分

注释

  • 11g JDBC 驱动程序仅针对 JDK 1.5 或 JDK 1.6 进行过认证。
  • 在Oracle Database 12c Release 2(12.2.0.1)中,Oracle JDBC驱动程序不再支持JDK 7或更早版本。
  • 还请注意关于取消对 classes12.jar 提供支持的以下文章 Product Obsolescence Desupport Notice, concerning the desupport of the classes12.jar:

    Note 335754.1 : JDBC 10.2 - classes12.jar , oracle.jdbc.driver, and OracleConnectionCacheImpl

由于 Server Thin Driver 和 Server Internal Driver 均在 Oracle Server 内运行,这些驱动程序支持的 Oracle JVM 版本如下:

Oracle 9i R1 支持 J2SE 1.2
Oracle 9i R2 支持 J2SE 1.3
Oracle 10g 支持 J2SE 1.4
Oracle 11g 支持 J2SE 1.5

哪个经过认证的 JDBC 驱动程序版本连接哪个数据库版本?
有关正确信息,请在 JDBC Developer's Guide and Reference 中查找所使用的 JDBC 版本。JDBC Developers Guide and Reference 11g Release 1 (11.1) 中的描述如下:

向后兼容性
JDBC 驱动程序已经过认证,兼容目前支持的 Oracle 数据库版本
。例如,Oracle Database 11g Release 1 (11.1) 中的 JDBC Thin 驱动程序
已经过认证,兼容 10.2.x、10.1.x、9.2.x 和 9.0.1.x Oracle 数据库版本。
然而,这些驱动程序没有经过是否兼容早期的、不受支持的数据库版本(
例如 8.0.x 和 7.x)的认证。

向前兼容性
现有的受支持的 JDBC 驱动程序已经过认证,兼容 Oracle Database 11g
Release 1 (11.1)。
尽管主功能会生效,但也可能发生旧版驱动程序无法使用数据库版本
新功能的情形。因此,建议至少使用与数据库版本相同的
JDBC 驱动程序版本

此外,还可通过参考以下注释查看 Oracle 客户端(Oracle JDBC 驱动程序)版本与 Oracle Server 版本之间的互操作性支持情况:
Note 207303.1 : Client / Server / Interoperability Support Between Different Oracle Versions

下表给出了哪个 JDBC 驱动程序可访问哪个 Oracle 数据库:

JDBC 驱动程序
Oracle 数据库

21c
21c
19c
18c
12.2.0
12.1.0

19c
21c
19c
18c
12.2.0
12.1.0
11.2.0*

18c
21c
19c
18c
12.2.0
12.1.0

11.2.0.4*

12.2.0
21c
19c
18c
12.2.0
12.1.0
11.2.0*

12.1.0
21c
19c
18c
12.2.0
12.1.0
11.2.0
11.1.0

11.2.0
19c *
18c*
12.2.0*
12.1.0
11.2.0
11.1.0
10.2.0
10.1.0
9.2.0

11.1.0 12.1.0
11.2.0
11.1.0
10.2.0
10.1.0
9.2.0
10.2.0 12.1.0
11.2.0
11.1.0
10.2.0
10.1.0
9.2.0
10.1 11.2.0
11.1.0
10.2.0
10.1.0
9.2.0
9.2.0

11.2.0
11.1.0
10.2.0
10.1.0
9.2.0

  • 取消支持的数据库版本。

如何获取 Java JDBC 库?
通过以下三种方法可获取 Java JDBC 库:

安装 Oracle 客户端或服务器之后。
这些文件位于 <ORACLE_HOME>/jdbc/lib 目录。
安装 Oracle 即时客户端之后。
从 JDBC 下载页 获取可用的jar文件。
注意:Java JDBC 库与平台无关。因此,可从任何 <ORACLE_HOME>/jdbc/lib 目录或 JDBC 下载页面获取这些库,并在任何具有 JDBC Thin 和 OCI 驱动程序类型的平台上使用。

此外,Oracle JDBC 驱动程序可以嵌入 Oracle 产品(例如 Fusion MiddleWare 产品)中。在这种情况下,对于 Oracle JDBC 驱动程序认证或升级问题,可参考与这些 Oracle 产品相关的文档。

如何安装 JDBC 驱动程序?
JDBC Thin driver
存储 Java JDBC 库并将 classpath 设置为合适的库。
JDBC OCI driver
安装与 JDBC 驱动程序相关的 Oracle 客户端或服务器。
从 10.1.0 开始,还可安装 Oracle 即时客户端(Oracle 客户端的子集)作为 Oracle 客户端的替代方案。存储 JDBC Java 库并将 CLASSPATH 设置为合适的库。
请注意,Oracle 客户端必须与所用 JDBC 驱动程序具有完全相同的版本。
KPRB driver
在数据库的 Java 选项中,JDBC 驱动程序已经可用。
Thin server-side driver
在数据库的 Java 选项中,JDBC 驱动程序已经可用。

如何找到存档的 JDBC 驱动程序资源、Javadoc 及示例?
以下与 JDBC 驱动程序版本相关的资源可用:

JDBC 开发者指南与参考可访问 Oracle's online documentation.
例如,Oracle 数据库 JDBC Developer's Guide and Reference 11g Release 2 (11.2) 或Oracle 数据库 JDBC Developer's Guide and Reference 12c Release 1 (12.1)
Readme.txt
安装 JDBC 之后,\jdbc 目录内的 Readme.txt 文件包含如下信息:
新功能
主要的 Bug 修正
驱动程序版本
设置环境
一些有用的提示
JDBC Javadoc
JDBC api 可能在 <ORACLE_HOME>\jdbc\doc 中以 javadoc.zip 形式出现
JDBC demos
说明不同 JDBC 功能的示例,在 <ORACLE_HOME>/jdbc/demo 目录中以 demo.tar 或 demo.zip 的形式提供。
JDBC javadoc 和样本的 Readme 文件还可在 JDBC 下载页 上找到,更多信息还可在 Oracle JDBC 页 上找到。
一开始可以使用哪个 Oracle JDBC 驱动程序?
10g JDBC Thin 驱动程序支持几乎与 JDBC OCI 驱动程序相同的功能(个别例外包括仅 Oracle JDBC OCI 驱动程序支持 TAF 功能)。它只需要 JDBC Java 库(尽管 JDBC OCI 驱动程序需要一个完整的 Oracle 或即时客户端安装)。从 10g JDBC Thin 驱动程序版本开始,Oracle JDBC 驱动程序使用更快的协议 (OCI/TTC 8) 访问 Oracle 数据库。使用 JDBC Thin 驱动程序的一个限制是使用 TCP/IP 协议访问数据库服务器。

因此,最好是从 10g 或 11g R2 JDBC Thin 驱动程序开始。

运行 JDBC 应用程序
如何设置环境以运行 JDBC 应用程序?
为了运行客户端 JDBC 程序(OCI 或 Thin 类型),必须在 CLASSPATH 中添加 Oracle JDBC Java 库。
如果您使用的是 Oracle JDBC OCI 驱动程序,则需安装与 JDBC 驱动程序版本完全相同的 Oracle 客户端。根据运行 JDBC 程序的平台,向 PATH (windows)、LD_LIBRARY_PATH (unix) 或 LIBPATH (aix) 添加存储 Oracle JDBC OCI 共享库的目录。
同时,在 64 位平台上,您可以选择是使用 32 位 JVM(即 java 可执行文件为 32 位)还是 64 位 JDK(即 java 可执行文件为 64 位)。
如果 Oracle JDBC OCI 驱动程序使用 64 位 JVM,JDBC OCI 共享库必须为 64 位库。
同理,如果 Oracle JDBC OCI 驱动程序使用 32 位 JVM,JDBC OCI 共享库必须为 32 位库。

以下是使用 10.2 JDBC 驱动程序的设置示例:

对于 Windows 平台:

  • 如果使用 JDK 1.2 或 1.3,则将 [ORACLE_HOME]\jdbc\lib\classes12.jar 添加至 CLASSPATH。

如果使用 JDK 1.4,则将 [ORACLE_HOME]\jdbc\lib\ojdbc14.jar 添加至 CLASSPATH。

  • 如果需要,将 [ORACLE_HOME]\jlib\orai18n.jar 添加至 CLASSPATH。
  • 如果使用 JDBC OCI 驱动程序,则将 [ORACLE_HOME]\bin 添加至 PATH。

对于 Solaris Unix:

  • 如果使用 JDK 1.2 或 1.3,则将 [ORACLE_HOME]/jdbc/lib/classes12.jar 添加至 CLASSPATH。
    如果使用 JDK 1.4,则将 [ORACLE_HOME]/jdbc/lib/ojdbc14.jar 添加至 CLASSPATH。
  • 如果需要,将 [ORACLE_HOME]/jlib/orai18n.jar 添加至 CLASSPATH。
  • 如果使用 JDBC OCI 驱动程序,则将 [ORACLE_HOME]/lib 添加至 LD_LIBRARY_PATH。

对于安装了 64 位 Oracle 的 Solaris 64 位平台:

  • 如果使用 32 位 JVM 运行 Oracle JDBC OCI 驱动程序,则将 $ORACLE_HOME/lib32 添加至 LD_LIBRARY_PATH。
  • 如果使用 64 位 JVM 运行 Oracle JDBC OCI 驱动程序,则将 $ORACLE_HOME/lib 添加至 LD_LIBRARY_PATH。

可导入哪个 Oracle JDBC 包?
可导入以下包:

oracle.jdbc.*;
oracle.jdbc.pool.*;
oracle.sql.*;
但是,不应导入 oracle.jdbc.driver.* 包。已从 9iR1 开始弃用该包,也将撤销对其的支持。
可参见以下 Product Obsolescence Desupport Notice:
Note 1439541.1 > : The oracle.jdbc.driver was "deprecated" in 9.0.1 and "desupported" in 11.1.

如何使用 Oracle JDBC 驱动程序 API 获取 JDBC 连接?
首先,在注册 Oracle JDBC 驱动程序后,可通过调用 java.sql.DriverManager 类的 getConnection() 方法打开一个 JDBC 连接。

...
DriverManager.registerDriver(new oracle.jdbc.OracleDriver() );
Connection conn = DriverManager.getConnection( dbUrl, dbUser, dbPassword);
...
使用 OracleDataSource 类的 getConnection 方法为您提供更多的灵活性:

...
ds = new oracle.jdbc.pool.OracleDataSource();
ds.setURL(dbUrl);
Connection conn = ds.getConnection(dbUser,dbPassword);
...

从 10g JDBC 驱动程序开始,可以通过这种方式使用“隐式连接”缓存机制。

从 Oracle Database 11g Release 2 (11.2) 开始,已弃用“隐式连接”缓存功能。此外,Oracle 建议对 JDBC 使用 Universal Connection Pool (UCP)。

什么是 Oracle JDBC 连接 URL?
连接 URL 定义用于连接的 Oracle 数据库服务器地址:

              jdbc:oracle:<drivertype>:<username/password>@<database> 

根据 Oracle 驱动程序的类型,URL 的形式如下:

oci type
jdbc:oracle:oci:@
其中,database 可以是:
tnsnames.ora 中定义的条目名
这可能需要设置 TNS_ADMIN 环境变量。
指定侦听器位置和服务名的描述符
//[:]/
其中
为 Oracle 数据库服务器主机名或 ip 地址
为 Oracle 侦听器端口号
为数据库的 Oracle
服务名。
Thin type
jdbc:oracle:thin:@
其中,database 可以是:
指定侦听器位置和服务名的描述符
//[:]/
其中
为 Oracle 数据库服务器主机名或 IP 地址
为 Oracle 侦听器端口号
为数据库的 Oracle
服务名。
kprb 类型 : jdbc:oracle:kprb:@

JDBC 连接可否同时被两个 Java 线程共享?
一次只能有一个线程访问 JDBC 连接和相关对象:

“避免让多个线程同时访问某个连接。如果多个线程必须共享连接,请使用规定的 begin-using/end-using 协议。”
(JDBC Developers Guide and Reference 中的编码提示)

Join the Java Development MOS Community forum for general discussions, questions, best practices, and other valuable information on: Oracle JDeveloper and ADF, Oracle WebLogic - JEE Programming (EJB, JMS etc), Oracle JDBC, Oracle Web Services (incl. DBWS Callout Utility), Oracle Web Services Manager (OWSM), Oracle Service Registry (OSR), Oracle Toplink (EclipseLink), Sun NetBeans IDE / Java Studio Creator & Java Studio Enterprise, OC4J, KODO.

相关文章
|
6月前
|
SQL Oracle 关系型数据库
WARNING: Too Many Parse Errors With error=911 When Running a JDBC Application Connected to an Oracle 19c database
WARNING: Too Many Parse Errors With error=911 When Running a JDBC Application Connected to an Oracle 19c database (
88 2
|
6月前
|
SQL Oracle 关系型数据库
实时计算 Flink版产品使用合集之使用JDBC方式读取Oracle的number类型时,通过什么方式进行映射
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
153 0
实时计算 Flink版产品使用合集之使用JDBC方式读取Oracle的number类型时,通过什么方式进行映射
|
6月前
|
Oracle Java 关系型数据库
【服务器】python通过JDBC连接到位于Linux远程服务器上的Oracle数据库
【服务器】python通过JDBC连接到位于Linux远程服务器上的Oracle数据库
71 6
|
Oracle 关系型数据库 Java
分享一个 Oracle RAC 模式下客户端建立JDBC初始连接时因ONS造成应用启动时卡顿30秒问题的排查分析案例
分享一个 Oracle RAC 模式下客户端建立JDBC初始连接时因ONS造成应用启动时卡顿30秒问题的排查分析案例
|
Oracle Java 关系型数据库
maven中安装oracle jdbc包到仓库以及引入
maven中安装oracle jdbc包到仓库以及引入
|
SQL Oracle Java
Java java jdbc thin远程连接并操作Oracle数据库
Java java jdbc thin远程连接并操作Oracle数据库
143 0
|
SQL Oracle Java
Jdbc连接Oracle数据库详细案例,占位符的使用
Jdbc连接Oracle数据库详细案例,占位符的使用
331 0
Jdbc连接Oracle数据库详细案例,占位符的使用
|
20天前
|
Java 关系型数据库 MySQL
mysql5.7 jdbc驱动
遵循上述步骤,即可在Java项目中高效地集成MySQL 5.7 JDBC驱动,实现数据库的访问与管理。
41 1
|
30天前
|
SQL 分布式计算 关系型数据库
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
78 0
|
30天前
|
SQL 分布式计算 关系型数据库
Hadoop-23 Sqoop 数据MySQL到HDFS(部分) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-23 Sqoop 数据MySQL到HDFS(部分) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
34 0