Como configurar o número de pools de conexão de banco de dados e HikariCP

Pool de conexão HikariCP

O pool de conexão HikariCP é um pool de conexão JDBC de alto desempenho, com três características marcadas no site oficial: rápido, simples e confiável, e seu desempenho é melhor do que outros pools de conexão.

O site oficial explica em detalhes algumas otimizações feitas pelo HikariCP, que são resumidas a seguir:

  • Otimização de bytecode: otimize o código até que o bytecode compilado seja o mínimo (nivelando a hierarquia de herança, ocultando variáveis ​​de membro e eliminando a conversão forçada de tipo), de modo que o cache da CPU possa carregar mais código de programa;
  • Otimize proxies e interceptores: reduza o código Por exemplo, o proxy de declaração do HikariCP tem apenas 100 linhas de código, que é apenas um décimo do BoneCP;
  • Tipo de array personalizado (FastStatementList) em vez de ArrayList: evite a verificação de intervalo toda vez que get () for chamado e evite a varredura do início ao fim ao chamar remove ();
  • Tipo de coleção livre de bloqueio personalizado (ConcurrentBag): melhora a eficiência de leitura e gravação simultâneas;

Uso de HikariCP

Como o SpringBoot2 integra o HikariCP por padrão, as dependências precisam ser introduzidas novamente. Depende principalmente do projeto mysql e springboot mybatis.

Configuração Yaml

# 配置数据源信息
spring:
  datasource:                                           # 数据源的相关配置
    type: com.zaxxer.hikari.HikariDataSource          # 数据源类型:HikariCP
    driver-class-name: com.mysql.jdbc.Driver          # mysql驱动
    url: jdbc:mysql://localhost:3306/foodie-dev?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true
    username: root
    password: 123456
    hikari:
      connection-timeout: 30000        # 等待连接池分配连接的最大时长(毫秒),超过这个时长还没可用的连接则发生SQLException, 默认:30秒
      minimum-idle: 5                  # 最小连接数
      maximum-pool-size: 20            # 最大连接数
      auto-commit: true                # 事务自动提交
      idle-timeout: 600000             # 连接超时的最大时长(毫秒),超时则被释放(retired),默认:10分钟
      pool-name: DateSourceHikariCP     # 连接池名字
      max-lifetime: 1800000             # 连接的生命时长(毫秒),超时而且没被使用则被释放(retired),默认:30分钟 1800000ms
      connection-test-query: SELECT 1  # 连接测试语句

# mybatis配置
mybatis:
  type-aliases-package: com.lzp.pojo          # 所有POJO类所在包路径
  mapper-locations: classpath:mapper/*.xml      # mapper映射文件

Definir o número de conexões no pool de conexão

Introduzir pool de conexão de banco de dados

A conexão com o banco de dados é um recurso limitado e caro. Um objeto de conexão com o banco de dados corresponde a uma conexão com um banco de dados físico. Se uma nova conexão for criada para cada operação do banco de dados e liberada após o uso, o desempenho do sistema será baixo, o que leva ao pool de conexão conceito.

O pool de conexão de banco de dados é responsável por alocar, gerenciar e liberar conexões de banco de dados.Ele permite que os aplicativos reutilizem uma conexão de banco de dados existente e pode ser considerado um contêiner para armazenar conexões de banco de dados.

O pool de conexão de banco de dados adota um modo de design de pool de recursos para compartilhamento de recursos, evitando a alocação frequente de recursos e problemas de liberação. Ao mesmo tempo, é conveniente para o gerenciamento unificado, pois através do controle do pool de conexões, a conexão entre o sistema e o banco de dados pode ser restringida e o número de conexões e o uso do banco de dados podem ser monitorados.

A necessidade de pool de conexão

1. Não use o processo de pool de conexão

Vamos usar o acesso ao MySQL como exemplo para executar um comando SQL. Se o pool de conexão não for usado, quais processos precisam ser executados.

Etapas para não usar o pool de conexão do banco de dados:

  1. Handshake de três vias para estabelecimento de conexão TCP
  2. Handshake de três vias para autenticação MySQL
  3. Execução SQL real
  4. Desligamento do MySQL
  5. O handshake de quatro vias do TCP está fechado

Pode-se ver que, para executar um trecho de SQL, existem muitas interações de rede.
Vantagens: Simples de implementar
Desvantagens:

  • Mais rede IO
  • A carga do banco de dados é alta
  • Longo tempo de resposta e baixo QPS
  • Os aplicativos frequentemente criam e fecham conexões, resultando em objetos mais temporários e GC frequentes
  • Depois de fechar a conexão, haverá muito status de TIME_WAIT TCP (fechado após 2 MSL)

2. Use o processo de pool de conexão

Etapas para usar o pool de conexão de banco de dados:

Na primeira vez que você visita, é necessário estabelecer uma conexão. No entanto, as visitas subsequentes reutilizarão a conexão criada anteriormente e executarão a instrução SQL diretamente.
vantagem:

  • Menos sobrecarga de rede
  • O desempenho do sistema será substancialmente melhorado
  • Sem problemas TIME_WAIT estado

Configuração do número de conexão do banco de dados

O sistema pode controlar as conexões no pool de conexão definindo parâmetros como o número mínimo de conexões e o número máximo de conexões. O número mínimo de conexões é o número de conexões de banco de dados criadas quando o sistema é iniciado. O número mínimo de conexões é pequeno, a inicialização é rápida e a resposta é lenta. Normalmente, a configuração é maior. O número mínimo de conexões pode ser definido para 5-10. O número máximo de conexões é definido de acordo com a configuração do hardware. A máquina de 4 núcleos pode ser definida para 10 e a máquina de 8 núcleos pode ser definida para 20.

O número padrão máximo e mínimo de conexões para HikariCP é 10. A sugestão do autor é definir o número máximo e mínimo de conexões com o mesmo valor e manter um pool de conexão de alto desempenho.

Por que o número de pools de conexão não é o maior possível?

O primeiro ponto, antes de tudo, precisamos saber que uma CPU single-core "simultaneamente" executa vários threads, o que é apenas uma ilusão. Uma CPU de núcleo único pode executar apenas um encadeamento por vez e, em seguida, o sistema operacional muda de contexto, o núcleo da CPU agenda rapidamente e executa o código de outro encadeamento. Isso envolve muita perda de desempenho extra causada pela troca de contexto.

O segundo ponto, acima, um servidor N-core pode fornecer um desempenho ideal, definindo o número de conexões de banco de dados como N. No entanto, a situação real será afetada por IO de disco e IO de rede. Durante o tempo de espera de IO, o encadeamento está bloqueado e esperando, e a CPU está em um estado ocioso. Portanto, quando os threads estão processando operações de negócios com E / S intensa, é necessário definir o número de threads / conexões para ser maior do que o da CPU para melhorar o rendimento.

Fórmula de cálculo para o número de conexões

连接数 = ((核心数 * 2) + 有效磁盘数)

A CPU do servidor é um i7 de 4 núcleos e o tamanho do pool de conexão deve ser ((4 * 2) + 1) = 9 ~ 10. As necessidades específicas devem ser ajustadas de acordo com os cenários reais de negócios.

Cena de negócios

  • Para acesso simultâneo, você pode usar um pequeno pool de conexão de banco de dados e, em seguida, colocar os threads de negócios restantes na fila para aguardar.
  • Se transações longas e curtas forem misturadas no sistema, a abordagem correta deve ser criar dois pools de conexão, um para transações longas e outro para consultas "em tempo real", ou seja, transações curtas.

Documentos de referência

  1. https://www.jianshu.com/p/15b846107a7c
  2. https://www.cnblogs.com/cocoxu1992/p/11031908.html
  3. https://blog.csdn.net/weiwosuoai/article/details/89955003

Acho que você gosta

Origin blog.csdn.net/LIZHONGPING00/article/details/106985493
Recomendado
Clasificación