通过 JDBC 驱动连接 Oracle 数据库

1、概览

Oracle 数据库是最流行的关系数据库之一。本文将带你了解如何使用 JDBC 驱动连接到 Oracle 数据库。

2、数据库

首先,我们需要一个数据库。如果没有,则可以从 Oracle Database Software Downloads 下载并安装免费版本,或者使用 Oracle Database Container Images 上的 Docker 镜像。

本文中使用的是 Oracle Database 23ai (23.5.0)Docker 镜像。

3、Maven 依赖

数据库就绪后,在项目中添加 Oracle 的 JDBC 驱动依赖,本文使用 ojdbc11 连接 Oracle 23ai

<dependency>
    <groupId>com.oracle.database.jdbc</groupId>
    <artifactId>ojdbc11</artifactId>
    <version>23.5.0.24.07</version>
</dependency>

ojdbc11 的最新版本可在 Central Maven Repository 中找到。该依赖项要求 Java 11 或更高版本,是较新版本 Java 的推荐驱动。

为了向后兼容,ojdbc8 可用于 Java 8。也推荐使用 ojdbc10 作为 Oracle 19c 的驱动程序。

4、连接到数据库

首先,创建一个 OracleDataSource(Oracle 数据源接口的实现)。这比使用 DriverManager 更好,因为 DataSource 更具可扩展性,也更易于设置。

初始化连接属性,并在 OracleDataSource 中设置属性和 URL。然后,调用 getConnection() 来获取新连接:

public static Connection getConnection(String databaseUrl, String userName, String password) throws SQLException {
    var connectionProperties = new Properties();
    connectionProperties.setProperty(OracleConnection.CONNECTION_PROPERTY_USER_NAME, userName);
    connectionProperties.setProperty(OracleConnection.CONNECTION_PROPERTY_PASSWORD, password);

    var oracleDataSource = new OracleDataSource();
    oracleDataSource.setConnectionProperties(connectionProperties);
    oracleDataSource.setURL(databaseUrl);

    return oracleDataSource.getConnection();
}

另外,OracleDataSourcesetUser()setPassword() 方法,可以用来代替 setConnectionProperties()。不过,值得注意的是,OracleConnection 静态地提供了许多属性名称,我们可以通过这种方法设置自动提交、缓存或获取大小等其他属性。

测试 getConnection() 方法,获取用户名:

@Test
void whenConnectionRetrieved_thenUserNameIsReturned() throws SQLException {
    var url = "jdbc:oracle:thin:@//localhost:1521/FREEPDB1";
    var userName = "BAELDUNG";
    var password = "baeldung_pw";

    String retrievedUser = null;
    try (var connection = ConnectToOracleDb.getConnection(url, userName, password)) {
        retrievedUser = connection.getMetaData().getUserName();
    }

    assertEquals(userName, retrievedUser);
}

此示例在一个 try-with-resources 块中创建连接,完成后自动关闭连接。

如果 URL、用户名或密码出错,就会看到 ORA error。例如,ORA-17868 表示主机未知,ORA-01017 表示凭证错误。

5、利用连接池优化性能

在优化性能时,有很多事情需要考虑。特别是,如果你正在开发 Web 应用,请考虑使用连接池。

连接池是一个可重复使用的数据库连接缓存。

Oracle 为 Java 11+ 及以上版本和 Java 8 提供了通用连接池(ucp11)。这是在 JDBC 依赖之上的额外依赖,但许多其他库(如 HikariTomcatApache Commons DBCP2)也可用于连接池。

6、总结

本文详细介绍了如何使用 ojdbc11 驱动连接 Oracle 23ai 数据库,以及如何利用连接池优化性能。


Ref:https://www.baeldung.com/java-jdbc-oracle-connection