Tous les produits
Search
Centre de documentation

AnalyticDB:Pool de connexions Druid

Dernière mise à jour :Aug 10, 2026

Une configuration incorrecte du pool de connexions pour AnalyticDB for MySQL peut entraîner des déconnexions, une répartition inégale de la charge sur les nœuds frontaux et un épuisement du pool lors des pics de trafic. Cette rubrique explique comment configurer Druid pour établir une connexion fiable avec un cluster AnalyticDB for MySQL dans le framework Spring, en indiquant les valeurs recommandées pour les paramètres et les méthodes de diagnostic.

Prérequis

Avant de commencer, assurez-vous de disposer des éléments suivants :

  • Une version de Druid supérieure à 1.1.16

  • L'endpoint du cluster, disponible sur la page Cluster Information de la console AnalyticDB for MySQL

  • Un compte de base de données (compte privilégié ou standard) ainsi que son mot de passe

Gestion des connexions par AnalyticDB for MySQL

AnalyticDB for MySQL utilise Server Load Balancer (SLB) pour répartir le trafic entre ses nœuds frontaux. Trois comportements découlent de cette architecture :

  • Configurez un nombre élevé de connexions afin que les requêtes soient réparties uniformément sur tous les nœuds frontaux.

  • Définissez maxEvictableIdleTimeMillis sur une valeur faible pour recycler rapidement les connexions inactives, évitant ainsi que la charge ne se concentre sur un sous-ensemble de nœuds.

  • Définissez keepAlive sur true pour réutiliser les connexions et éviter la surcharge liée aux connexions éphémères.

Configuration du pool de connexions

L'extrait XML suivant configure un bean DruidDataSource pour le framework Spring. Remplacez les trois espaces réservés ${...} par vos valeurs réelles.

<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
      init-method="init" destroy-method="close">

    <!-- Connection credentials -->
    <property name="url"      value="${jdbc_url}" />
    <property name="username" value="${jdbc_user}" />
    <property name="password" value="${jdbc_password}" />

    <!-- Pool size -->
    <property name="initialSize" value="5" />
    <property name="minIdle"     value="10" />
    <property name="maxActive"   value="20" />

    <!-- Connection acquisition timeout (ms) -->
    <property name="maxWait" value="60000" />

    <!-- Idle connection lifetime (ms)
         Connections idle longer than maxEvictableIdleTimeMillis are removed.
         Set maxEvictableIdleTimeMillis to a small value so idle connections
         rotate across SLB frontend nodes, keeping the load balanced. -->
    <property name="minEvictableIdleTimeMillis" value="600000" />
    <property name="maxEvictableIdleTimeMillis" value="900000" />

    <!-- Idle-connection scan interval (ms)
         Default: 60000. A value that is too high may prevent Druid from
         detecting dropped connections in time. -->
    <property name="timeBetweenEvictionRunsMillis" value="2000" />

    <!-- Validate connections idle longer than timeBetweenEvictionRunsMillis.
         Prefer this over testOnBorrow/testOnReturn in normal networks. -->
    <property name="testWhileIdle" value="true" />

    <!-- Validate on borrow/return — enable only in highly important or unreliable network scenarios. -->
    <property name="testOnBorrow" value="false" />
    <property name="testOnReturn" value="false" />

    <!-- Keepalive — prevents short-lived connections and improves connection reuse.
         Default for keepAliveBetweenTimeMillis: 120000 ms. -->
    <property name="keepAlive"                 value="true" />
    <property name="keepAliveBetweenTimeMillis" value="30000" />

    <!-- Limit reuse per connection to avoid long-term load imbalance across frontend nodes. -->
    <property name="phyMaxUseCount" value="1000" />

    <!-- Validation query (see "Enable validationQuery in newer Druid versions" below) -->
    <property name="validationQuery" value="select 1" />

    <!-- Monitoring statistics filter -->
    <property name="filters" value="stat" />
</bean>

Paramètres clés

Paramètre Valeur recommandée Conséquence d'une erreur de configuration
keepAlive true Si la valeur est false, les connexions éphémères génèrent une surcharge et peuvent épuiser le pool sous forte charge.
maxEvictableIdleTimeMillis Une valeur faible Si la valeur est trop élevée, les connexions restent associées au même nœud frontal, provoquant un déséquilibre de charge.
timeBetweenEvictionRunsMillis 2000 (par défaut : 60000) Si la valeur est trop élevée, Druid risque de ne pas détecter les connexions interrompues à temps, entraînant des erreurs de connexion.
testOnBorrow / testOnReturn false (par défaut) Définir les deux sur true ajoute un aller-retour à chaque emprunt/retour ; à utiliser uniquement dans des scénarios réseau critiques ou peu fiables.
phyMaxUseCount 1000 Si ce paramètre n'est pas défini, une seule connexion longue durée peut traiter tout le trafic, créant un nœud frontal surchargé.

Activer validationQuery dans les versions récentes de Druid

Dans les versions récentes de Druid, validationQuery est remplacé par mysqlPing par défaut. Pour utiliser validationQuery (select 1) à la place, définissez la propriété druid.mysql.usePingMethod sur false après avoir appelé init() :

druidDataSource.init();

Properties properties = new Properties();
properties.setProperty("druid.mysql.usePingMethod", "false");
druidDataSource.setConnectProperties(properties);

Diagnostic du pool de connexions

Obtenir un instantané du pool

Appelez dataSource.dump() pour obtenir l'état actuel du pool et de ses connexions individuelles :

{
    CreateTime:"2022-06-01 15:28:10",
    ActiveCount:0,
    PoolingCount:2,
    CreateCount:2,
    DestroyCount:0,
    CloseCount:4,
    ConnectCount:4,
    Connections:[
        {
            ID:525571,
            ConnectTime:"2022-06-01 15:28:11",
            UseCount:0,
            LastActiveTime:"2022-06-01 15:28:11"
        },
        {ID:1263877414, ConnectTime:"2022-06-01 15:28:11", UseCount:4, LastActiveTime:"2022-06-01 15:28:11"}
    ]
}
Champ Description
CreateTime Heure de création du pool de connexions
ActiveCount Nombre de connexions actuellement extraites et utilisées
PoolingCount Nombre de connexions actuellement inactives dans le pool
CreateCount Nombre total de connexions créées, y compris celles recréées après destruction
DestroyCount Nombre total de connexions détruites en raison de l'expiration ou d'erreurs
CloseCount Nombre total d'appels à conn.close() — connexions renvoyées au pool
ConnectCount Nombre total d'appels à dataSource.getConnection() ; correspond à la somme de toutes les valeurs UseCount
ID Identifiant interne de la connexion
ConnectTime Heure d'établissement de la connexion physique
UseCount Nombre de fois où cette connexion a été extraite
LastActiveTime Dernière extraction de cette connexion ; égal à ConnectTime si jamais utilisée

Vérifier la configuration effective

Appelez dataSource.getStatData() pour confirmer que votre configuration est appliquée. Comparez les valeurs renvoyées avec la définition de votre bean ; toute divergence indique un paramètre qui n'a pas été pris en compte.

{
    InitialSize=1,
    MinIdle=2,
    MaxActive=3,
    TestOnBorrow=true,
    TestOnReturn=true,
    TestWhileIdle=true,
    KeepAlive=true,
    KeepAliveCheckCount=332,
    MinEvictableIdleTimeMillis=600000,
    MaxEvictableIdleTimeMillis=900000,
    MaxWait=6000,
    ...
}

Appelez périodiquement getStatData() et dump() en production pour confirmer que les paramètres restent effectifs et que le pool se comporte comme configuré. Vous pouvez également vérifier la configuration via les journaux de l'application.

Remarques d'utilisation

  • Appelez toujours conn.close() dès qu'une requête est terminée pour renvoyer la connexion au pool. Si une connexion n'est pas renvoyée après utilisation et devient invalide, Druid ne peut pas détecter son état invalide.

  • Dans des environnements réseau complexes — tels que ceux présentant des goulets d'étranglement au niveau de la passerelle, des trajets réseau longs, des instabilités réseau, des taux de retransmission élevés ou des pertes de paquets — les connexions peuvent être interrompues même avec un pool correctement configuré. Ajoutez une politique de nouvelle tentative à votre code d'application pour gérer les déconnexions transitoires.