Oracle连接池与Spring

2023/05/18

1. 概述

Oracle是大型生产环境中最受欢迎的数据库之一。因此,作为Spring开发人员,必须使用这些数据库是很常见的。

在本教程中,我们将讨论如何进行这种集成。

2. 数据库

我们首先需要的当然是数据库。如果我们没有安装,我们可以获取并安装Oracle数据库软件下载中提供的任何数据库。但如果我们不想进行任何安装,我们也可以使用Docker提供的Oracle数据库镜像

在本例中,我们将使用Oracle Database 12c第2版(12.2.0.2)标准版Docker镜像,这样我们可以不必在计算机上安装新软件。

3. 连接池

现在我们已经为传入连接准备好数据库。接下来,让我们学习一些在Spring中配置连接池的不同方法。

3.1 HikariCP

使用Spring连接池的最简单方法是使用自动配置。spring-boot-starter-jdbc依赖包括HikariCP作为首选池化数据源。因此,如果我们查看我们的pom.xml,我们将看到:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

spring-boot-starter-data-jpa依赖为我们传递了spring-boot-starter-jdbc依赖。

现在只需要将我们的配置添加到application.properties文件中:

# OracleDB connection settings
spring.datasource.url=jdbc:oracle:thin:@//localhost:11521/ORCLPDB1
spring.datasource.username=books
spring.datasource.password=books
spring.datasource.driver-class-name=oracle.jdbc.OracleDriver

# HikariCP settings
spring.datasource.hikari.minimumIdle=5
spring.datasource.hikari.maximumPoolSize=20
spring.datasource.hikari.idleTimeout=30000
spring.datasource.hikari.maxLifetime=2000000
spring.datasource.hikari.connectionTimeout=30000
spring.datasource.hikari.poolName=HikariPoolBooks

# JPA settings
spring.jpa.database-platform=org.hibernate.dialect.Oracle12cDialect
spring.jpa.hibernate.use-new-id-generator-mappings=false
spring.jpa.hibernate.ddl-auto=create

如你所见,我们有三个不同的部分配置设置:

  • OracleDB连接设置部分是我们像往常一样配置JDBC连接属性的地方
  • HikariCP设置部分是我们配置HikariCP连接池的地方。如果需要高级配置,我们可以阅读HikariCP配置属性列表
  • JPA设置部分是使用Hibernate的一些基本配置

3.2 Tomcat和Commons DBCP2连接池

Spring因其性能推荐HikariCP另一方面,它在Spring Boot自动配置应用程序中也支持Tomcat和Commons DBCP2

Spring Boot首先尝试使用HikariCP。如果它不可用,则尝试使用Tomcat连接池。如果这些都不可用,则它会尝试使用Commons DBCP2。

我们还可以指定要使用的连接池。在这种情况下,我们只需要在application.properties文件中添加一个新属性:

spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource

如果我们需要配置特定设置,我们可以使用它们的前缀:

  • spring.datasource.hikari.*用于HikariCP配置
  • spring.datasource.tomcat.*用于Tomcat池配置
  • spring.datasource.dbcp2.*用于Commons DBC2配置

而且,实际上,我们可以设置spring.datasource.type为任何其他DataSource实现。不一定是上面提到的三个中的任何一个。

但在这种情况下,我们将只有一个基本的开箱即用配置。在很多情况下,我们需要一些高级配置。让我们看看其中的一些。

3.3 Oracle通用连接池

如果我们想使用高级配置,我们可以声明UCP数据源并在application.properties文件中设置其余属性。从UCP的21.1.0.0版开始,这是最简单的方法。

适用于JDBC的Oracle通用连接池(UCP)为缓存JDBC连接提供了一个功能齐全的实现,它重用连接而不是创建新连接。它还为我们提供了一组用于自定义池行为的属性。

如果我们要使用UCP,我们需要添加以下Maven依赖项:

<dependency>
    <groupId>com.oracle.database.jdbc</groupId>
    <artifactId>ojdbc8</artifactId>
</dependency>
<dependency>
    <groupId>com.oracle.database.ha</groupId>
    <artifactId>ons</artifactId>
</dependency>
<dependency>
    <groupId>com.oracle.database.jdbc</groupId>
    <artifactId>ucp</artifactId>
</dependency>

现在我们只需要将我们的配置添加到application.properties文件中:

# UCP settings
spring.datasource.type=oracle.oracleucp.jdbc.UCPDataSource
spring.datasource.oracleucp.connection-factory-class-name=oracle.jdbc.pool.OracleDataSource
spring.datasource.oracleucp.sql-for-validate-connection=select * from dual
spring.datasource.oracleucp.connection-pool-name=UcpPoolBooks
spring.datasource.oracleucp.initial-pool-size=5
spring.datasource.oracleucp.min-pool-size=5
spring.datasource.oracleucp.max-pool-size=10

在上面的示例中,我们自定义了一些池属性:

  • spring.datasource.oracleucp.initial-pool-size指定池启动后创建的可用连接数
  • spring.datasource.oracleucp.min-pool-size指定我们的池维护的可用和借用连接的最小数量
  • spring.datasource.oracleucp.max-pool-size指定我们的池维护的最大可用和借用连接数

如果我们需要添加更多配置属性,可以查看UCPDataSource JavaDoc开发人员指南

4. 旧的Oracle版本

对于11.2之前的版本,如Oracle 9i或10g,我们应该创建一个OracleDataSource而不是使用Oracle的通用连接池。

在我们的OracleDataSource实例中,我们通过setConnectionCachingEnabled打开连接缓存:

@Configuration
@Profile("oracle")
public class OracleConfiguration {
    @Bean
    public DataSource dataSource() throws SQLException {
        OracleDataSource dataSource = new OracleDataSource();
        dataSource.setUser("books");
        dataSource.setPassword("books");
        dataSource.setURL("jdbc:oracle:thin:@//localhost:11521/ORCLPDB1");
        dataSource.setFastConnectionFailoverEnabled(true);
        dataSource.setImplicitCachingEnabled(true);
        dataSource.setConnectionCachingEnabled(true);
        return dataSource;
    }
}

在上面的示例中,我们为连接池创建了OracleDataSource并配置了一些参数。我们可以在OracleDataSource JavaDoc上检查所有可配置的参数。

5. 总结

我们已经了解了如何使用自动配置和编程方式来配置Oracle数据库连接池。尽管Spring推荐使用HikariCP,但其他选项也是可用的。我们应该根据我们当前的需求选择正确的实现。

与往常一样,本教程的完整源代码可在GitHub上获得。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章