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:
- Handshake de três vias para estabelecimento de conexão TCP
- Handshake de três vias para autenticação MySQL
- Execução SQL real
- Desligamento do MySQL
- 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
- https://www.jianshu.com/p/15b846107a7c
- https://www.cnblogs.com/cocoxu1992/p/11031908.html
- https://blog.csdn.net/weiwosuoai/article/details/89955003