杰瑞科技汇

Java如何远程连接Oracle数据库?

核心原理

Java 程序本身并不直接与 Oracle 数据库通信,它需要通过一个“桥梁”,这个桥梁就是 JDBC (Java Database Connectivity) API,这个 API 定义了一套标准的接口,而具体的实现则由数据库厂商(如 Oracle)提供,称为 JDBC Driver (驱动程序)

Java如何远程连接Oracle数据库?-图1
(图片来源网络,侵删)

整个连接过程可以概括为:

  1. 加载驱动:Java 程序启动时,加载 Oracle 的 JDBC 驱动。
  2. 建立连接:使用 DriverManager 类,提供数据库的 URL、用户名和密码,来创建一个到数据库的物理连接。
  3. 创建语句:通过连接对象,创建 StatementPreparedStatement 对象,用于执行 SQL 语句。
  4. 执行查询:使用语句对象执行 SQL,并获取返回的结果集。
  5. 处理结果:遍历结果集,获取数据。
  6. 关闭资源:按顺序关闭结果集、语句和连接,释放资源。

详细步骤

第一步:获取 Oracle JDBC 驱动

你需要下载 Oracle 的 JDBC 驱动程序,目前最常用的是 ojdbc8.jarojdbc11.jar

  • 下载地址:你可以从 Oracle 官方网站下载,但通常需要登录账号,一个更方便的来源是 Maven 中央仓库。
  • 版本选择
    • ojdbc8.jar: 用于 Java 8 和 Oracle 数据库 12c 及更高版本。
    • ojdbc11.jar: 用于 Java 11 及更高版本。

第二步:配置项目环境

将下载的 JDBC 驱动 JAR 文件添加到你的 Java 项目中,根据你使用的开发工具,方法不同:

  • 使用 IDE (如 IntelliJ IDEA 或 Eclipse):

    Java如何远程连接Oracle数据库?-图2
    (图片来源网络,侵删)
    1. 右键你的项目 -> Build Path / Project Structure -> Libraries
    2. 点击 Add External JARs... 或 号。
    3. 选择你下载的 ojdbc8.jar 文件,点击 OK。
  • 使用 Maven (推荐): 在你的 pom.xml 文件中添加以下依赖,Maven 会自动帮你下载和管理依赖。

    <!-- 对于 Java 8 -->
    <dependency>
        <groupId>com.oracle.database.jdbc</groupId>
        <artifactId>ojdbc8</artifactId>
        <version>19.3.0.0</version> <!-- 请使用最新的稳定版本 -->
    </dependency>
    <!-- 对于 Java 11+ -->
    <!-- <dependency>
        <groupId>com.oracle.database.jdbc</groupId>
        <artifactId>ojdbc11</artifactId>
        <version>21.5.0.0</version> <!-- 请使用最新的稳定版本 -->
    </dependency> -->
  • 使用 Gradle: 在你的 build.gradle 文件中添加:

    // 对于 Java 8
    implementation 'com.oracle.database.jdbc:ojdbc8:19.3.0.0'
    // 对于 Java 11+
    // implementation 'com.oracle.database.jdbc:ojdbc11:21.5.0.0'

第三步:编写 Java 连接代码

下面是一个完整的、带有资源自动关闭(try-with-resources)的示例代码。

OracleJdbcExample.java

Java如何远程连接Oracle数据库?-图3
(图片来源网络,侵删)
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:@//<your_oracle_host>:<your_oracle_port>/<your_service_name_or_sid>";
    private static final String USER = "<your_username>";
    private static final String PASS = "<your_password>";
    public static void main(String[] args) {
        // 使用 try-with-resources 语句,确保 Connection, Statement, ResultSet 被自动关闭
        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) {
            System.err.println("连接 Oracle 数据库失败!");
            e.printStackTrace();
        }
    }
}

数据库 URL 格式详解

代码中的 DB_URL 是最关键的部分,它决定了如何连接到数据库,Oracle 提供了多种 URL 格式:

@//host:port/service_name (推荐,现代 Oracle 数据库首选)

这是最常用和推荐的格式,适用于 Oracle Database 10g 及更高版本。

  • host: 数据库服务器的 IP 地址或主机名。
  • port: Oracle 监听器端口,默认为 1521
  • service_name: 数据库的服务名,你可以在数据库服务器上使用以下 SQL 查询:
    SELECT value FROM v$parameter WHERE name = 'service_names';

示例: jdbc:oracle:thin:@//192.168.1.100:1521/ORCLCDB

@host:port:SID (传统方式)

SID 是数据库的标识符,在较老的 Oracle 版本中更常见。

  • SID: 数据库的系统标识符,你可以在数据库服务器上使用以下 SQL 查询:
    SELECT instance_name FROM v$instance;

示例: jdbc:oracle:thin:@192.168.1.100:1521:ORCL

使用 TNSNames (适用于复杂网络环境)

如果你的网络配置复杂,或者使用了 TNSNAMES.ORA 文件,可以使用这种方式。

  1. 配置 TNSNAMES.ORA 文件: 在客户端机器上(运行 Java 程序的机器),找到 tnsnames.ora 文件(通常在 Oracle 客户端安装目录的 network/admin 下),添加一个别名:

    MY_ORACLE_DB =
      (DESCRIPTION =
        (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521))
        (CONNECT_DATA =
          (SERVER = DEDICATED)
          (SERVICE_NAME = ORCLCDB)
        )
      )
  2. Java 代码中使用别名: DB_URL 变为: jdbc:oracle:thin:@MY_ORACLE_DB


常见问题及解决方案

问题 1:java.sql.SQLException: No suitable driver found

  • 原因:JVM 没有加载到 Oracle JDBC 驱动。
  • 解决方案
    1. 确保 ojdbc8.jar 已正确添加到项目的 Classpath 中。
    2. 在代码中显式加载驱动(虽然现代 JDBC 驱动会自动注册,但显式加载是好的习惯):
      // 在 DriverManager.getConnection 之前添加
      Class.forName("oracle.jdbc.OracleDriver");

问题 2:java.sql.SQLException: IO Error: The Network Adapter could not establish the connection

  • 原因:网络不通,Java 程序无法访问到 Oracle 服务器的指定端口。

  • 解决方案

    1. 检查 IP 地址和端口:确认 DB_URL 中的 hostport 是否正确。

    2. 检查防火墙

      • 客户端防火墙:确保运行 Java 程序的机器的防火墙允许从你的程序到 host:port 的出站连接。
      • 服务器防火墙:确保 Oracle 服务器所在网络的防火墙允许来自你客户端 IP 地址到 1521 端口的入站连接。
    3. 测试网络连通性:在客户端机器上使用 telnet 命令测试是否能通到 Oracle 服务器。

      # Windows
      telnet <your_oracle_host> 1521
      # Linux/macOS
      nc -zv <your_oracle_host> 1521

      如果不通,说明网络问题,请检查网络配置和防火墙。

问题 3:java.sql.SQLException: ORA-01017: invalid username/password; logon denied

  • 原因:用户名或密码错误。
  • 解决方案:仔细核对 DB_URL 中的 USERPASS 是否与数据库中的用户名和密码完全一致(注意大小写)。

问题 4:java.sql.SQLException: ORA-12514: TNS:listener does not currently know of service requested in connect descriptor

  • 原因:监听器知道你的请求,但找不到你指定的 service_nameSID
  • 解决方案
    1. 确认服务名/SID:在数据库服务器上使用 SQL 查询确认 service_namesinstance_name 的值是否正确。
    2. 检查监听器状态:在数据库服务器上,使用 lsnrctl status 命令检查监听器是否正在运行,以及它是否正在监听正确的服务名/SID。

最佳实践

  1. 使用 try-with-resources:始终使用 try-with-resources 语句来管理 Connection, Statement, 和 ResultSet,以防止资源泄漏。
  2. 使用 PreparedStatement:对于任何包含用户输入的 SQL 查询,都应该使用 PreparedStatement 来防止 SQL 注入攻击,并提高性能。
  3. 使用连接池:在 Web 应用或高并发场景中,不要频繁创建和销毁连接,应使用连接池(如 HikariCP, DBCP, C3P0)来复用数据库连接,显著提升性能,Spring Boot 默认集成了 HikariCP。
  4. 配置 tnsnames.ora:对于生产环境,将复杂的连接字符串配置在 tnsnames.ora 文件中,而不是硬编码在 Java 代码里,便于维护。
分享:
扫描分享到社交APP
上一篇
下一篇