y0ngb1n

Aben Blog

欢迎来到我的技术小黑屋ヾ(◍°∇°◍)ノ゙
github

最適なプラクティス丨Alibaba Druid データベース接続プールの迅速な統合

プロジェクトは GitHub にホスティングされています:y0ngb1n/spring-boot-samples、Star や Fork を歓迎します 😘


依存関係の追加 Maven Central#

<dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>druid-spring-boot-starter</artifactId>
   <version>${alibaba-druid.version}</version>
</dependency>

設定属性#

spring:
  datasource:
    url: jdbc:h2:mem:recommend
    username: sa
    password:
    ##
    # データソースのタイプを DruidDataSource に設定
    ##
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      ##
      # 初期サイズ、最小、最大接続プール数を設定
      # - min-idle:プール内で維持される最小アイドル接続数、デフォルトは 0
      # - max-active:プール内の最大接続数、アイドルと使用中の接続を含む、デフォルトは 8;推奨設定:20、ほとんどのシナリオでは 20 で十分ですが、このパラメータは使用シナリオに大きく依存します。通常、正常な接続数の 3~5 倍に設定します。
      ##
      initial-size: 5
      min-idle: 10
      max-active: 20
      ##
      # パラメータはアイドル接続を保持するかどうかを示します。ブール型。
      #
      # では、接続を保持する必要がある場合、keepAlive を true に設定すればいいのでしょうか?
      # 確かに true は保持メカニズムを有効にしますが、どれだけの接続を保持するか、ハートビートチェックのルールは何か、これらは正しく設定する必要があります。さもなければ、期待通りにならない可能性があります。
      # ここで理解する必要があるいくつかの関連パラメータ:minIdle 最小接続プール数、接続保持の数、アイドル接続のタイムアウトによる排除プロセスで保持される接続数(前提は現在の接続数が minIdle 以上であること)、実際には keepAlive は既存の接続のみを維持し、新しい接続を作成することはありません。たとえ接続数が minIdle 未満であっても;
      # minEvictableIdleTimeMillis 単位ミリ秒、接続がアイドル状態で排除されない最小時間、保持ハートビートはこの値を超える接続に対してのみ行われます;
      # maxEvictableIdleTimeMillis 単位ミリ秒、接続がアイドル状態で保持される最大時間、接続が何らかの操作を実行した後、タイマーがリセットされます(ハートビート保持操作を含む);
      # timeBetweenEvictionRunsMillis 単位ミリ秒、Destroy スレッドが接続を検出する間隔時間、検出プロセス中にハートビートがトリガーされます。保持チェックの詳細なプロセスはソースコード com.alibaba.druid.pool.DruidDataSource.DestroyTask を参照してください。その中でハートビートチェックは設定に応じて ping または validationQuery で構成されたチェック文を使用します。
      #
      # 推奨設定:ネットワーク状況が悪い場合、プログラムの起動が遅い場合、または突発的なトラフィックが頻繁に発生する場合は、true に設定することを推奨します;
      ##
      keep-alive: true
      # プール内で接続が最小限に生存する時間を設定、単位はミリ秒
      min-evictable-idle-time-millis: 600000
      max-evictable-idle-time-millis: 900000
      # どのくらいの間隔で検出を行うか、閉じる必要のあるアイドル接続を検出する、単位はミリ秒
      time-between-eviction-runs-millis: 2000
      ##
      # 接続取得の待機タイムアウト時間を設定
      #
      # 推奨設定:
      # - 内部ネットワーク(ネットワーク状況が良い)800;
      # - ネットワーク状況があまり良くない場合は 1200 以上を推奨します。なぜなら、tcp 接続の再試行は一般的に 1 秒だからです;
      ##
      max-wait: 800
      ##
      # connectTimeout と socketTimeout を設定できます。これらの単位はミリ秒であり、これらのパラメータはネットワーク異常に対処する上で非常に重要です。
      # - connectTimeout TCP 接続を確立する際のタイムアウト時間を設定;
      # - socketTimeout リクエストを送信した後、応答を待つタイムアウト時間を設定;
      # これらの二つのパラメータは jdbc url に connectTimeout=xxx&socketTimeout=xxx を追加することで設定することもできます。connectionProperties と jdbc url の両方で設定を試みましたが、connectionProperties の設定が優先されることがわかりました。
      # これらの二つのタイムアウト時間を設定しないと、サービスには非常に高いリスクがあります。実際のケースでは、ネットワーク異常後にアプリケーションが DB に接続できないことが判明しましたが、再起動後には正常に DB にアクセスできました。ネットワーク異常時に socket はネットワークエラーを検出できないため、接続は実際には「死んだ接続」となります。socket ネットワークタイムアウトを設定しない場合、接続は DB からの結果を待ち続け、新しいリクエストが接続を取得できなくなります。
      #
      # 推奨設定:socketTimeout=3000;connectTimeout=1200
      ##
      connect-properties: socketTimeout=3000;connectTimeout=1200
      ##
      # 接続が有効かどうかを検出するための SQL 文
      ##
      validation-query: select 1
      ##
      # 接続を申請する際に検出し、アイドル時間が timeBetweenEvictionRunsMillis を超える場合、validationQuery を実行して接続が有効かどうかを検出
      ##
      test-while-idle: true
      ##
      # 接続を申請する際に validationQuery を実行して接続が有効かどうかを検出。この設定を行うとパフォーマンスが低下します
      ##
      test-on-borrow: false
      ##
      # 接続を返却する際に validationQuery を実行して接続が有効かどうかを検出。この設定を行うとパフォーマンスが低下します
      ##
      test-on-return: false
      ##
      # 使用回数が一定に達した後に再接続を切断することで、複数のサーバー間の負荷をより均等にする
      ##
      phy-max-use-count: 1000

複数データソース#

設定の追加#

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      ##
      # 複数の DruidDataSource の監視データを統合
      ##
      use-global-data-source-stat: true
      ##
      # Druid データソース 1 の設定
      ##
      foo:
        url: jdbc:h2:mem:foo
        username: foo
        password:
        initial-size: 5
        min-idle: 10
        max-active: 20
        maxWait: 800
      ##
      # Druid データソース 2 の設定
      ##
      bar:
        url: jdbc:h2:mem:bar
        username: bar
        password:
        initial-size: 5
        min-idle: 10
        max-active: 20
        maxWait: 1200

データソースの作成#

@Configuration
public class DruidConfig {

  @Bean
  @Primary
  @ConfigurationProperties("spring.datasource.druid.foo")
  public DataSource dataSourceFoo() {
    return DruidDataSourceBuilder.create().build();
  }

  @Bean
  @ConfigurationProperties("spring.datasource.druid.bar")
  public DataSource dataSourceBar() {
    return DruidDataSourceBuilder.create().build();
  }
}

フィルターの設定#

spring:
  datasource:
    druid:
      filters: config,stat,slf4j
      filter:
        config:
          enabled: true
        ##
        # StatFilter の設定、参考文献:https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_StatFilter
        ##
        stat:
          enabled: true
          # スロークエリの記録を有効にする
          log-slow-sql: true
          # スロークエリの基準、単位:ミリ秒
          slow-sql-millis: 5000
        slf4j:
          enabled: true
        wall:
          enabled: true
      ##
      # StatViewServlet の設定、参考文献:https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_StatViewServlet%E9%85%8D%E7%BD%AE
      # http://127.0.0.1:8080/druid にアクセスすると、監視ページを見ることができます
      ##
      stat-view-servlet:
        enabled: true
        login-username: yangbin
        login-password: yangbin

監視データ#

@RestController
public class DruidStatController {

  @GetMapping("/druid/stat")
  public Object druidStat() {
    return DruidStatManagerFacade.getInstance().getDataSourceStatDataList();
  }
}

🔗️ 参考リンク#

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。