杰瑞科技汇

Java如何测试连接Oracle数据库?

核心步骤

无论使用哪种方式,连接 Oracle 数据库的核心步骤都遵循以下模式:

Java如何测试连接Oracle数据库?-图1
(图片来源网络,侵删)
  1. 加载 JDBC 驱动:告诉 Java 程序使用哪个数据库的驱动。
  2. 获取数据库连接:使用 JDBC URL、用户名和密码建立与数据库的连接。
  3. 创建执行语句:通过连接对象创建 StatementPreparedStatement 来执行 SQL。
  4. 执行 SQL 并处理结果:执行查询,并遍历 ResultSet 获取数据。
  5. 关闭资源非常重要! 按照相反的顺序关闭 ResultSetStatementConnection,以释放数据库资源。

使用 JDBC(传统方式)

这是最基础也是最核心的方式,所有高级框架(如 MyBatis, Hibernate)的底层都是 JDBC。

准备工作

  • 安装 Oracle 数据库:确保你有一个可访问的 Oracle 数据库实例。

  • 获取 Oracle JDBC 驱动 (ojdbc.jar)

    • 你可以从 Oracle 官网下载,通常需要登录 Oracle 账户。
    • Maven 用户:这是最推荐的方式,在 pom.xml 中添加依赖,它会自动下载驱动。
    • Gradle 用户:在 build.gradle 中添加依赖。

    Maven (pom.xml) 示例:

    Java如何测试连接Oracle数据库?-图2
    (图片来源网络,侵删)
    <!-- 请根据你的 Oracle 版本选择合适的 ojdbc 驱动 -->
    <!-- 对于 Oracle 19c 及以上版本 -->
    <dependency>
        <groupId>com.oracle.database.jdbc</groupId>
        <artifactId>ojdbc8</artifactId>
        <version>19.3.0.0</version>
    </dependency>
    <!-- 或者使用 Universal Connection Pool (UCP) 驱动,它也包含了 JDBC 功能 -->
    <!-- <dependency>
        <groupId>com.oracle.database.jdbc</groupId>
        <artifactId>ojdbc8</artifactId>
        <version>19.3.0.0</version>
    </dependency> -->

    注意:ojdbc8 用于 Java 8,ojdbc11 用于 Java 11+,请根据你的 JDK 版本选择。

Java 代码示例

以下是一个完整的、可运行的 Java 类,用于测试连接并执行一个简单的查询。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class OracleJdbcTest {
    // --- 请根据你的实际情况修改以下信息 ---
    private static final String DB_URL = "jdbc:oracle:thin:@//your_host:your_port/your_service_name";
    // 或者使用 SID 格式 (较老的方式): "jdbc:oracle:thin:@your_host:your_port:your_sid"
    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 成功!");
            } else {
                System.out.println("连接 Oracle 失败!");
                return;
            }
            // 处理查询结果
            while (rs.next()) {
                // 通过列名或列索引获取数据
                String message = rs.getString("message");
                System.out.println("查询结果: " + message);
            }
        } catch (SQLException e) {
            System.err.println("连接 Oracle 数据库时出错!");
            e.printStackTrace();
        }
    }
}

如何填写 JDBC URL?

JDBC URL 的格式至关重要,Oracle 主要支持两种格式:

thin + Service Name (推荐,现代版本)

Java如何测试连接Oracle数据库?-图3
(图片来源网络,侵删)

这是 Oracle Database 10g R2 及以后版本推荐的方式,更灵活。

  • 语法: jdbc:oracle:thin:@//<host>:<port>/<service_name>

  • 示例: jdbc:oracle:thin:@//localhost:1521/ORCLCDB

  • 如何获取 Service Name?

    • 使用 SQL*Plus 或其他客户端工具连接数据库。
    • 执行 SQL 查询:SELECT value FROM v$parameter WHERE name = 'service_names';
    • 或者查询动态性能视图:SELECT name FROM v$active_services;

thin + SID (旧版本)

在一些较老的系统或特定配置中可能会用到。

  • 语法: jdbc:oracle:thin:@<host>:<port>:<sid>

  • 示例: jdbc:oracle:thin:@localhost:1521:ORCL

  • 如何获取 SID?

    • 连接到数据库后,执行 SELECT instance_name FROM v$instance; 的结果通常就是 SID。

使用连接池(生产环境推荐)

在真实的应用中,频繁地创建和销毁连接是非常消耗资源的,连接池(Connection Pool)可以复用数据库连接,极大地提高性能。

准备工作

除了 Oracle JDBC 驱动,你还需要一个连接池库。HikariCP 是目前性能最好、最流行的选择。

Maven (pom.xml) 示例:

<!-- Oracle JDBC 驱动 -->
<dependency>
    <groupId>com.oracle.database.jdbc</groupId>
    <artifactId>ojdbc8</artifactId>
    <version>19.3.0.0</version>
</dependency>
<!-- HikariCP 连接池 -->
<dependency>
    <groupId>com.zaxxer</groupId>
    <artifactId>HikariCP</artifactId>
    <version>5.0.1</version>
</dependency>

Java 代码示例

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class OracleHikariCPTest {
    private static HikariDataSource dataSource;
    // 静态代码块,在类加载时初始化连接池
    static {
        HikariConfig config = new HikariConfig();
        // --- 请根据你的实际情况修改以下信息 ---
        config.setJdbcUrl("jdbc:oracle:thin:@//your_host:your_port/your_service_name");
        config.setUsername("your_username");
        config.setPassword("your_password");
        // 连接池优化配置 (推荐)
        config.setDriverClassName("oracle.jdbc.OracleDriver");
        config.addDataSourceProperty("cachePrepStmts", "true");
        config.addDataSourceProperty("prepStmtCacheSize", "250");
        config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
        config.setMaximumPoolSize(10); // 最大连接数
        config.setMinimumIdle(5);      // 最小空闲连接数
        config.setConnectionTimeout(30000); // 连接超时时间 (毫秒)
        config.setIdleTimeout(600000);     // 空闲连接超时时间 (毫秒)
        config.setMaxLifetime(1800000);    // 连接最大存活时间 (毫秒)
        // -----------------------------------------
        dataSource = new HikariDataSource(config);
    }
    public static void main(String[] args) {
        // 从连接池中获取一个连接
        try (Connection conn = dataSource.getConnection();
             Statement stmt = conn.createStatement();
             ResultSet rs = stmt.executeQuery("SELECT 'Hello from Oracle with HikariCP!' as message FROM DUAL")) {
            System.out.println("成功从 HikariCP 连接池获取连接!");
            while (rs.next()) {
                String message = rs.getString("message");
                System.out.println("查询结果: " + message);
            }
        } catch (SQLException e) {
            System.err.println("从连接池获取连接或执行查询时出错!");
            e.printStackTrace();
        }
        // 在应用关闭时,关闭整个连接池
        // dataSource.close();
    }
}

常见问题与排查

  1. java.lang.ClassNotFoundException: oracle.jdbc.OracleDriver

    • 原因:JDBC 驱动 .jar 文件没有被添加到项目的 classpath 中。
    • 解决
      • 如果你使用 Maven/Gradle,确保 pom.xmlbuild.gradle 中的依赖配置正确,并执行了 mvn installgradle build
      • 如果你手动管理 jar,请确保 ojdbc.jar 在运行时(如 lib 目录下)或编译时(IDE 的 Library)可用。
  2. java.sql.SQLException: IO Error: The Network Adapter could not establish the connection

    • 原因:网络问题,Java 应用无法访问到指定的 Oracle 数据库主机和端口。
    • 排查
      • 检查主机名/IPyour_host 是否正确?是否可以 ping 通?
      • 检查端口your_port (通常是 1521) 是否正确?是否被防火墙阻拦?
      • 测试监听:在数据库服务器上,使用 lsnrctl status 命令检查监听器是否正在运行,以及它是否正在监听正确的端口和协议。
  3. java.sql.SQLException: ORA-01017: invalid username/password; logon denied

    • 原因:用户名或密码错误。
    • 解决:仔细核对 USERPASS 变量。
  4. java.sql.SQLException: ORA-12514: TNS:listener does not currently know of service requested in connect descriptor

    • 原因:在 JDBC URL 中指定的 Service NameSID 不正确,或者监听器没有配置该服务。
    • 排查
      • 确认你使用的是 Service Name 还是 SID 格式。
      • 在数据库服务器上,使用 lsnrctl services 命令查看监听器上注册了哪些服务。
      • 使用 SQL 查询确认正确的 Service Name 或 SID(见上文)。
  5. java.sql.SQLException: No suitable driver found for jdbc:oracle:thin:...

    • 原因:虽然驱动类找到了,但 JDBC URL 的格式可能不被识别,或者 Class.forName() 没有被调用(在旧版 JDBC 中需要)。
    • 解决
      • 检查 JDBC URL 的拼写,确保完全符合 jdbc:oracle:thin:@//... 的格式。
      • 在现代 JDBC (4.0+) 中,DriverManager 会自动注册驱动,通常不需要手动 Class.forName("oracle.jdbc.OracleDriver"),但如果遇到问题,可以尝试加上这行代码。

  1. 使用 Maven/Gradle 管理依赖:避免手动管理 jar 文件,简化项目配置和迁移。
  2. 使用连接池:在生产环境中,绝对不要每次都创建新连接,HikariCP 是首选。
  3. 使用 try-with-resources:确保 Connection, Statement, ResultSet 等资源在使用后能被自动关闭,防止资源泄漏。
  4. 将数据库配置外部化:不要将 URL、用户名、密码等硬编码在代码中,应该使用配置文件(如 application.properties)或环境变量来管理。
  5. 使用 PreparedStatement:对于有参数的 SQL 查询,始终使用 PreparedStatement,它可以防止 SQL 注入攻击,并可能提高性能(通过预编译)。
分享:
扫描分享到社交APP
上一篇
下一篇