Oracle JDBC URL 的基本结构
Oracle JDBC URL 的基本格式如下:

jdbc:oracle:driver_type:[username/password]@database_connect_identifier
让我们分解一下这个结构的每个部分:
-
jdbc:oracle:这是所有 Oracle JDBC URL 的固定前缀,表示这是一个用于连接 Oracle 数据库的 JDBC URL。
-
driver_type
(图片来源网络,侵删)- 指定要使用的 Oracle 驱动类型,这取决于你的 Oracle 数据库版本和 Java 驱动版本(JDBC Driver)。
thin: 这是最常用的类型,它是一个纯 Java 驱动,不需要在客户端安装 Oracle 软件即可连接,它通过 TCP/IP 直接与数据库通信。oci(Oracle Call Interface): 这是一个需要 Oracle 客户端库(如 Oracle Instant Client)支持的驱动,它提供了更好的性能和一些高级功能,但配置相对复杂。
-
[username/password]- 可选部分,你可以在 URL 中直接提供用户名和密码,也可以不在 URL 中提供,而是在获取
Connection对象时单独传入。 - 推荐做法:为了安全性和灵活性,不在 URL 中硬编码用户名和密码,而是在代码中单独传入。
- 可选部分,你可以在 URL 中直接提供用户名和密码,也可以不在 URL 中提供,而是在获取
-
database_connect_identifier- 这是 URL 中最重要的部分,用于定位数据库实例,主要有两种方式:Service Name 和 SID。Service Name 是目前推荐的方式。
Service Name vs. SID (数据库标识符)
这是 Oracle 连接中最容易混淆的部分,理解它们的区别至关重要。
| 特性 | Service Name (服务名) | SID (System Identifier, 系统标识符) |
|---|---|---|
| 定义 | 一个或多个数据库实例的逻辑别名,通常与全局数据库名(DB_NAME.DB_DOMAIN)对应。 |
数据库实例的唯一名称,在启动数据库时指定。 |
| 推荐度 | 强烈推荐 (Oracle 10g 及以后版本引入,是现代 Oracle 的标准) | 旧标准,主要用于兼容老版本数据库。 |
| 现代用法 | 在 tnsnames.ora 文件中,以及在 JDBC URL 中使用 service_name 参数。 |
在 tnsnames.ora 文件中,以及在 JDBC URL 中直接使用 SID。 |
| 示例 | ORCLCDB.localdomain |
orcl |
不同 Oracle 驱动版本的 URL 写法
Oracle JDBC 驱动也在不断演进,URL 写法也随之变化。

a. 驱动版本 ojdbcX.jar (经典版本,如 ojdbc6.jar, ojdbc8.jar)
这是最常见和经典的驱动写法。
使用 Service Name (推荐)
jdbc:oracle:thin:@//<host>:<port>/<service_name>
//<host>: 数据库服务器的主机名或 IP 地址。<port>: 监听器端口,默认为1521。<service_name>: 数据库的服务名。
示例:
jdbc:oracle:thin:@//mydbhost.example.com:1521/ORCLCDB
使用 SID (旧方式)
jdbc:oracle:thin:@<host>:<port>:<sid>
<sid>: 数据库的 SID。
示例:
jdbc:oracle:thin:@mydbhost.example.com:1521:orcl
b. 驱动版本 ucp.jar 和 ojdbcX.jar (Oracle Universal Connection Pool - UCP)
当使用 UCP 时,URL 格式略有不同,更强调连接池属性。
使用 Service Name
jdbc:oracle:thin:@//<host>:<port>/<service_name>
URL 本身和经典版本一样,但通常会与 DataSource 接口和 UCP 一起使用。
c. 驱动版本 ojdbcX_g.jar (新版 JDBC Driver - Oracle JDBC Driver 19.3 及以后)
从 Oracle JDBC Driver 19.3 开始,引入了一个新的属性 TNS_ADMIN,可以更方便地管理 tnsnames.ora 文件。
使用 tnsnames.ora 文件 (最灵活的方式)
你可以将连接信息(包括主机、端口、服务名/SID)放在一个 tnsnames.ora 文件中,然后在 JDBC URL 中通过 TNS_ADMIN 属性指向该文件的位置。
jdbc:oracle:thin:@TNS_ADMIN=<path_to_tns_admin_directory>
或者
jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=<host>)(PORT=<port>))(CONNECT_DATA=(SERVICE_NAME=<service_name>)))
示例 (直接在 URL 中使用 DESCRIPTION 语法):
jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=mydbhost.example.com)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCLCDB)))
完整的 Java 连接代码示例
以下是一个完整的 Java 程序示例,展示了如何使用 Service Name 和 Thin 驱动 连接到 Oracle 数据库。
步骤 1: 添加 JDBC 驱动依赖
如果你使用 Maven,在 pom.xml 中添加依赖:
<!-- Oracle JDBC Driver 19.3.0.0 -->
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<version>19.3.0.0</version>
</dependency>
如果你使用 Gradle,在 build.gradle 中添加:
// Oracle JDBC Driver 19.3.0.0 implementation 'com.oracle.database.jdbc:ojdbc8:19.3.0.0'
步骤 2: 编写 Java 连接代码
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class OracleJdbcExample {
// 数据库连接信息 - 请根据你的环境修改
private static final String DB_URL = "jdbc:oracle:thin:@//localhost:1521/ORCLCDB";
private static final String USER = "your_username";
private static final String PASS = "your_password";
public static void main(String[] args) {
// 使用 try-with-resources 语句,确保连接、语句和结果集在使用后自动关闭
try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT 'Hello from Oracle!' as message FROM DUAL")) {
// 检查连接是否成功
if (conn != null) {
System.out.println("连接 Oracle 数据库成功!");
}
// 处理查询结果
while (rs.next()) {
// 假设查询返回一个名为 "message" 的列
String message = rs.getString("message");
System.out.println("数据库返回消息: " + message);
}
} catch (SQLException e) {
// 捕获并处理 SQL 异常
System.err.println("连接数据库失败!");
e.printStackTrace();
}
}
}
常见问题与排错
-
java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver- 原因: Java 虚拟机找不到 Oracle JDBC 驱动类。
- 解决: 确保你已经将
ojdbcX.jar文件添加到你的项目的 classpath 中。
-
java.sql.SQLException: Io 异常: The Network Adapter could not establish the connection- 原因: 无法连接到指定的主机和端口,通常意味着:
- 数据库服务器未启动。
- 防火墙阻止了 1521 端口。
- 主机名或 IP 地址错误。
- Oracle 监听器未启动或配置不正确。
- 解决: 检查网络连通性(使用
ping命令),检查端口是否开放(使用telnet <host> <port>),并检查数据库监听器状态。
- 原因: 无法连接到指定的主机和端口,通常意味着:
-
java.sql.SQLException: ORA-01017: invalid username/password; logon denied- 原因: 用户名或密码错误。
- 解决: 仔细检查用户名和密码是否正确,并确认该用户是否有权限连接到指定的数据库实例。
-
java.sql.SQLException: ORA-12514: TNS:listener does not currently know of service requested in connect descriptor- 原因: 如果你使用 Service Name,这个错误表示监听器上没有注册你提供的服务名,如果你使用 SID,这个错误表示监听器上没有注册你提供的 SID。
- 解决: 确认你提供的服务名或 SID 是正确的,你可以登录到数据库服务器,使用
lsnrctl services命令查看监听器当前知道的服务。
希望这份详细的指南能帮助你成功配置 Java 与 Oracle 数据库的连接!
