您的位置:

Spring Hikari详解

Spring Hikari是作为Spring Boot的默认数据源而存在的。它是一个高性能的JDBC连接池库,通过实现快速的连接池和轻量级的Java库,让我们操作数据库更加得心应手。本文将从以下几个方面对Spring Hikari进行详细阐述。

一、减少应用程序对资源的负担

使用Hikari连接池的主要优势是它非常快,特别是在高并发应用程序中。在高并发场景下,许多线程同时执行查询或更新操作,此时使用传统的连接池可能会产生性能瓶颈。而Hikari连接池采用了“细粒度锁”的策略,使用synchronized锁住每个Connection对象,这大大减少了线程的争夺。

此外,Hikari使用了一些特定的算法来跟踪连接状态,以及如何动态管理连接。通过这些算法,Hikari连接池能够高效地使用并实时管理连接,从而减少了应用程序对系统资源的占用。

下面是Spring Boot与Hikari集成的相关代码:

#application.properties
spring.datasource.hikari.connection-timeout=60000
spring.datasource.hikari.maximum-pool-size=10
spring.datasource.hikari.minimum-idle=5

二、自动化配置

使用Spring Hikari的另一个优点是自动化配置。通过在Spring Boot中添加Hikari的依赖,所有的配置细节都会自动处理。这就意味着我们不需要担心数据库连接的基本设置,只需要关心我们的业务逻辑。Spring Boot将自动将这些配置应用到Hikari连接池中,使我们的应用程序具备高效而可伸缩的数据库连接。

如下所示是Hikari默认的一些属性:

spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.maximum-pool-size=10
spring.datasource.hikari.idle-timeout=60000
spring.datasource.hikari.connection-timeout=10000
spring.datasource.hikari.auto-commit=true

如果我们想更改这些属性的默认值,则可以在应用程序的属性文件中进行更改。例如,可以将连接池的最大大小更改为20,最小大小更改为10:

spring.datasource.hikari.maximum-pool-size=20
spring.datasource.hikari.minimum-idle=10

三、使用正确的连接池参数

在使用Spring Hikari时,我们需要了解一些连接池的参数。这些参数包括最小空闲连接数、最大活动连接数、连接超时等。了解这些参数的作用,可以帮助我们更好地配置Hikari连接池,并为我们的应用程序提供最佳的性能。

下面列出了一些重要的连接池参数:

  • maximumPoolSize:连接池中连接的最大数量。如果连接区满了,等待一个空闲连接的线程将在getConnection()方法中堵塞,直到本次请求连接成功或者达到超时时间。
  • minimumIdle:连接池中维护的最小空闲连接数。如果设置为0,则在连接池启动之初不会在池中预填充任何连接。
  • connectionTimeout:连接超时时间,单位毫秒。等待连接创建的超时时间,如果超过此时间将引发SQLException。
  • idleTimeout:连接最大空闲时间,单位毫秒。如果连接空闲时间大于此参数,而且当前池中连接数大于minimumIdle,则释放此连接。
  • maxLifetime:连接的最大生存时间,单位毫秒。超过此时间将关闭连接,同时从池中删除此连接。0表示没有最大生存时间。

我们可以在应用程序的属性文件中设置这些参数,例如:

spring.datasource.hikari.connectionTimeout=30000
spring.datasource.hikari.maxLifetime=1800000
spring.datasource.hikari.idleTimeout=600000
spring.datasource.hikari.minimumIdle=2
spring.datasource.hikari.maximumPoolSize=20

四、使用定时器进行性能监控

为了更好地监控应用程序的连接佔用状况,可以在应用程序中嵌入一个定时器来实时监控。下面是监控Hikari连接池的一些示例代码:

@Configuration
public class MonitorConfig {
  @Bean(name = "hikariPoolMonitor")
  public TaskScheduler taskScheduler() {
    return new ConcurrentTaskScheduler(Executors.newSingleThreadScheduledExecutor());
  }

  @Bean
  public PoolStatsDumps poolStatsDumps(HikariDataSource hikariDataSource,
                                       @Qualifier("hikariPoolMonitor") TaskScheduler taskScheduler) {
    return new PoolStatsDumps(hikariDataSource, taskScheduler);
  }
}

@Aspect
@Component
public class PoolStatsDumps {
  private final Logger LOGGER = LoggerFactory.getLogger(getClass());
  private final String now = LocalDateTime.now().format(DateTimeFormatter.ISO_DATE_TIME);
  private final HikariDataSource hikariDatasource;
  private final ScheduledExecutorService taskScheduler;

  public PoolStatsDumps(HikariDataSource hikariDatasource, TaskScheduler taskScheduler) {
    this.hikariDatasource = hikariDatasource;
    this.taskScheduler = taskScheduler.getScheduledExecutor();
  }

  @PostConstruct
  public void init() {
    taskScheduler.scheduleAtFixedRate(() -> {
      long activeConnections = hikariDatasource.getHikariPoolMXBean().getActiveConnections();
      long idleConnections = hikariDatasource.getHikariPoolMXBean().getIdleConnections();
      long threadsAwaitingConnection = hikariDatasource.getHikariPoolMXBean()
          .getThreadsAwaitingConnection();
      LOGGER.info("HikariStats: {} Active Connections:{} Idle Connections:{} Threads waiting:{}",
          now, activeConnections, idleConnections, threadsAwaitingConnection);
    }, Duration.ofSeconds(30).toMillis());
  }
}

上述监控将每隔30秒记录一次Hikari连接池的状态,并打印出连接池中的活动、空闲连接数以及等待线程数。

总结

本文从多方面阐述了Spring Hikari的优势和应用,包括减少应用程序对资源的负担、自动化配置、使用正确的连接池参数以及使用定时器进行性能监控。通过灵活运用这些方面,我们能够更好地使用Spring Boot与Hikari集成,为我们的业务逻辑提供更加高效和可靠的数据库连接。