核心要素
一个标准的 Oracle JDBC 连接字符串(也称为 URL)通常包含以下几个部分:

jdbc:oracle:driver_type:@host:port:sid_or_service_name
jdbc:oracle:: 固定前缀,表示使用 Oracle 的 JDBC 驱动。driver_type: 驱动类型,主要有以下几种:thin: 纯 Java 驱动,最常用,通过 TCP/IP 直接连接数据库。oci: Oracle Call Interface (OCI) 驱动,需要安装 Oracle 客户端库,性能更高,但配置复杂。
@host: 数据库服务器的 IP 地址或主机名。port: 数据库监听的端口号,默认是1521。sid_or_service_name: 这是关键部分,用于标识数据库实例。- SID (System Identifier): 数据库实例的唯一标识符,是传统的标识方式。
- SERVICE_NAME: Oracle 推荐的现代标识方式,尤其是在使用 RAC (Real Application Clusters) 和 Data Guard 时更灵活。
常见连接字符串示例
根据您的 Oracle 版本和网络环境,连接字符串的写法有所不同。
使用 thin 驱动(最常用)
thin 驱动不依赖任何本地库,是 Java 应用的首选。
a) 连接 Oracle 9i, 10g, 11g (使用 SID)
// 格式: jdbc:oracle:thin:@host:port:sid String url = "jdbc:oracle:thin:@localhost:1521:ORCL";
localhost: 数据库所在服务器地址。1521: Oracle 默认监听端口。ORCL: 数据库实例的 SID。
b) 连接 Oracle 10g, 11g, 12c 及更高版本 (推荐使用 SERVICE_NAME)
这是 Oracle 官方推荐的方式,尤其是在新版本中。
// 格式: jdbc:oracle:thin:@host:port/service_name String url = "jdbc:oracle:thin:@localhost:1521/ORCL";
ORCL: 这里的ORCL是数据库的SERVICE_NAME,而不是 SID,你可以通过查询v$parameter表中的service_names来确认。
c) 使用 TNS (Transparent Network Substrate) 别名
如果您的客户端(如 tnsnames.ora 文件)中定义了数据库别名,可以直接使用。

// 格式: jdbc:oracle:thin:@tns_alias String url = "jdbc:oracle:thin:@my_oracle_db";
my_oracle_db:tnsnames.ora文件中定义的别名。
d) 使用 EZConnect (Oracle 12c 及更高版本推荐)
Oracle 12c 引入了 EZConnect,简化了连接字符串的编写,无需 tnsnames.ora。
// 格式: jdbc:oracle:thin:[user]/[password]@[host]:[port]/[service_name] String url = "jdbc:oracle:thin:scott/tiger@localhost:1521/ORCL";
这种方式将用户名和密码也包含在了 URL 中,虽然方便,但安全性不高,不推荐在代码中硬编码。
完整的 Java 连接代码示例
下面是一个完整的、使用 thin 驱动和 SERVICE_NAME 连接 Oracle 数据库的示例。
第1步:添加 JDBC 驱动依赖
您需要将 Oracle JDBC 驱动的 JAR 包添加到您的项目中。

Maven (pom.xml)
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<version>19.3.0.0</version> <!-- 请根据你的 Oracle 版本选择合适的版本 -->
</dependency>
Gradle (build.gradle)
implementation 'com.oracle.database.jdbc:ojdbc8:19.3.0.0' // 请根据你的 Oracle 版本选择合适的版本
手动下载 JAR
如果你不使用构建工具,可以从 Oracle 官网下载 JDBC 驱动 JAR 文件(如 ojdbc8.jar 或 ojdbc11.jar),并将其添加到项目的类路径中。
第2步:编写 Java 连接代码
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class OracleJdbcConnection {
// 数据库连接信息
// 请根据你的实际情况修改这些值
private static final String DB_URL = "jdbc:oracle:thin:@localhost:1521/ORCL";
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()) {
System.out.println("Message: " + rs.getString("message"));
}
} catch (SQLException e) {
System.err.println("连接 Oracle 数据库失败!");
e.printStackTrace();
}
}
}
常见问题与解决方案
Q1: java.sql.SQLException: No suitable driver found
原因分析:
- JDBC 驱动 JAR 包没有添加到项目的类路径中。
- JDBC 驱动 JAR 包版本与你的 Java 或 Oracle 数据库版本不兼容。
- 连接字符串的格式不正确,导致
DriverManager无法识别。
解决方案:
- 检查类路径:确保
ojdbcX.jar在运行时可以被找到,在 IDE(如 IntelliJ IDEA, Eclipse)中检查库是否正确配置;使用命令行运行时,确保使用-cp或-classpath参数指定 JAR 包路径。 - 检查驱动版本:确保下载的 JDBC 驱动版本与你的 Oracle 数据库版本兼容,连接 Oracle 19c 数据库,推荐使用
ojdbc8.jar或更高版本。 - 检查 URL 格式:确保 URL 以
jdbc:oracle:thin:开头,并且格式正确。
Q2: java.net.ConnectException: Connection refused: connect
原因分析:
这通常意味着你的 Java 应用程序无法连接到指定的 host:port,问题出在网络层面,而不是 JDBC 驱动本身。
解决方案:
- 检查 Oracle 监听器是否启动:在数据库服务器上,执行
lsnrctl status命令,检查监听器是否正在运行,以及是否在监听1521(或你指定的)端口。 - 检查防火墙:确保数据库服务器的防火墙允许来自你应用程序所在机器的连接请求。
- 检查主机名和端口:确认
host和port参数填写正确,尝试使用telnet <host> <port>命令来测试网络连通性。
Q3: ORA-12541: TNS:no listener
原因分析: 与上一个问题类似,表明目标地址没有监听任何服务的进程。
解决方案:
- 同上,检查数据库服务器的监听器状态和防火墙设置。
Q4: ORA-12514: TNS:listener does not currently know of service requested in connect descriptor
原因分析:
监听器运行正常,但它不认识你连接字符串中指定的 SERVICE_NAME 或 SID。
解决方案:
- 确认
SERVICE_NAME或SID是否正确:这是最常见的原因,登录到数据库服务器,使用 SQL*Plus 或 SQL Developer 等工具,执行以下 SQL 查询来确认正确的值:- 查询
SERVICE_NAME:SELECT value FROM v$parameter WHERE name = 'service_names';
- 查询
SID:SELECT instance_name FROM v$instance;
- 查询
- 检查监听器配置:在监听器配置文件(通常是
$ORACLE_HOME/network/admin/listener.ora)中,确认SERVICE_NAMES或SID_NAME是否已正确注册。
总结表格
| 连接方式 | URL 格式 | 适用场景 | 备注 |
|---|---|---|---|
| Thin (SID) | jdbc:oracle:thin:@host:port:sid |
较老的 Oracle 版本 (9i, 10g) | 传统方式,逐渐被 SERVICE_NAME 取代。 |
| Thin (SERVICE_NAME) | jdbc:oracle:thin:@host:port/service_name |
推荐,适用于 10g 及以上版本 | Oracle 官方推荐,更灵活,支持 RAC。 |
| Thin (TNS别名) | jdbc:oracle:thin:@tns_alias |
客户端已配置 tnsnames.ora |
方便管理多个数据库连接。 |
| Thin (EZConnect) | jdbc:oracle:thin:usr/pwd@host:port/svc |
推荐,适用于 12c 及以上版本 | 简化连接,无需配置文件。 |
希望这份详细的指南能帮助您成功建立 Java 与 Oracle 数据库的连接!
