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集成,為我們的業務邏輯提供更加高效和可靠的數據庫連接。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/247240.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 13:19
下一篇 2024-12-12 13:19

相關推薦

發表回復

登錄後才能評論