杰瑞科技汇

Oracle Java连接字符串如何正确配置?

Oracle JDBC URL 的基本结构

Oracle JDBC URL 的基本格式如下:

Oracle Java连接字符串如何正确配置?-图1
(图片来源网络,侵删)
jdbc:oracle:driver_type:[username/password]@database_connect_identifier

让我们分解一下这个结构的每个部分:

  • jdbc:oracle:

    这是所有 Oracle JDBC URL 的固定前缀,表示这是一个用于连接 Oracle 数据库的 JDBC URL。

  • driver_type

    Oracle Java连接字符串如何正确配置?-图2
    (图片来源网络,侵删)
    • 指定要使用的 Oracle 驱动类型,这取决于你的 Oracle 数据库版本和 Java 驱动版本(JDBC Driver)。
    • thin: 这是最常用的类型,它是一个纯 Java 驱动,不需要在客户端安装 Oracle 软件即可连接,它通过 TCP/IP 直接与数据库通信。
    • oci (Oracle Call Interface): 这是一个需要 Oracle 客户端库(如 Oracle Instant Client)支持的驱动,它提供了更好的性能和一些高级功能,但配置相对复杂。
  • [username/password]

    • 可选部分,你可以在 URL 中直接提供用户名和密码,也可以不在 URL 中提供,而是在获取 Connection 对象时单独传入。
    • 推荐做法:为了安全性和灵活性,不在 URL 中硬编码用户名和密码,而是在代码中单独传入。
  • database_connect_identifier

    • 这是 URL 中最重要的部分,用于定位数据库实例,主要有两种方式:Service NameSIDService 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 写法也随之变化。

Oracle Java连接字符串如何正确配置?-图3
(图片来源网络,侵删)

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.jarojdbcX.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 NameThin 驱动 连接到 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

    • 原因: 无法连接到指定的主机和端口,通常意味着:
      1. 数据库服务器未启动。
      2. 防火墙阻止了 1521 端口。
      3. 主机名或 IP 地址错误。
      4. 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 数据库的连接!

分享:
扫描分享到社交APP
上一篇
下一篇