A configuração incorreta do pool de conexões do AnalyticDB for MySQL pode causar quedas de conexão, distribuição desigual de carga entre os nós de frontend e esgotamento do pool durante picos de tráfego. Este tópico demonstra como configurar o Druid para estabelecer uma conexão confiável com um cluster do AnalyticDB for MySQL no Spring Framework, apresentando valores de parâmetros recomendados e orientações de diagnóstico.
Pré-requisitos
Antes de começar, verifique se você tem:
Versão do Druid superior a 1.1.16
O endpoint do cluster, disponível na página Cluster Information do console do AnalyticDB for MySQL
Uma conta de banco de dados (privilegiada ou padrão) e a respectiva senha
Como o AnalyticDB for MySQL utiliza conexões
O AnalyticDB for MySQL usa o Server Load Balancer (SLB) para distribuir o tráfego entre os nós de frontend. Essa arquitetura exige as seguintes práticas:
Configure um número elevado de conexões para distribuir as requisições uniformemente por todos os nós de frontend.
Defina
maxEvictableIdleTimeMilliscom um valor baixo para reciclar rapidamente as conexões ociosas e evitar a concentração de carga em poucos nós.Defina
keepAlivecomotruepara reutilizar conexões e evitar a sobrecarga de conexões efêmeras.
Configure o pool de conexões
O trecho XML a seguir configura um bean DruidDataSource para o Spring Framework. Substitua os três espaços reservados ${...} pelos seus valores reais.
<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>
Parâmetros principais
|
Parâmetro |
Valor recomendado |
Impacto de configuração incorreta |
|
|
|
Se definido como |
|
|
Valor baixo |
Valores altos mantêm as conexões no mesmo nó de frontend e causam desequilíbrio de carga. |
|
|
|
Intervalos longos impedem a detecção oportuna de conexões perdidas pelo Druid, resultando em erros. |
|
|
|
Definir ambos como |
|
|
|
Sem essa configuração, uma única conexão persistente pode concentrar todo o tráfego e sobrecarregar um nó de frontend específico. |
Ative validationQuery em versões recentes do Druid
Nas versões recentes do Druid, validationQuery é substituído por mysqlPing por padrão. Para usar validationQuery (select 1), defina a propriedade druid.mysql.usePingMethod como false após chamar init():
druidDataSource.init();
Properties properties = new Properties();
properties.setProperty("druid.mysql.usePingMethod", "false");
druidDataSource.setConnectProperties(properties);
Diagnosticar o pool de conexões
Obter um snapshot do pool
Chame dataSource.dump() para obter o estado atual do pool e das conexões individuais:
{
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"}
]
}
|
Campo |
Descrição |
|
|
Momento de criação do pool de conexões |
|
|
Conexões atualmente em uso |
|
|
Conexões ociosas no pool |
|
|
Total de conexões criadas, incluindo recriações após destruição |
|
|
Total de conexões destruídas por expiração ou erros |
|
|
Total de chamadas a |
|
|
Total de chamadas a |
|
|
Identificador interno da conexão |
|
|
Horário de estabelecimento da conexão física |
|
|
Número de vezes que a conexão foi obtida do pool |
|
|
Última utilização da conexão; igual a |
Verifique a configuração efetiva
Execute dataSource.getStatData() para confirmar se a configuração está ativa. Compare os valores retornados com a definição do bean: divergências indicam falha na aplicação de alguma configuração.
{
InitialSize=1,
MinIdle=2,
MaxActive=3,
TestOnBorrow=true,
TestOnReturn=true,
TestWhileIdle=true,
KeepAlive=true,
KeepAliveCheckCount=332,
MinEvictableIdleTimeMillis=600000,
MaxEvictableIdleTimeMillis=900000,
MaxWait=6000,
...
}
Em produção, chame periodicamente getStatData() e dump() para garantir a validade das definições e o comportamento correto do pool. Você também pode validar as configurações pelos logs da aplicação.
Observações de uso
Sempre chame
conn.close()assim que a consulta terminar para devolver a conexão ao pool. Se uma conexão utilizada não for devolvida e tornar-se inválida, o Druid não detectará essa invalidade.Em ambientes de rede complexos (com gargalos de gateway, caminhos longos, instabilidade, altas taxas de retransmissão ou perda de pacotes), as conexões podem cair mesmo com o pool configurado corretamente. Implemente uma política de nova tentativa no código da aplicação para lidar com desconexões transitórias.