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();
  }
}

🔗️ 参考リンク#

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