Resumo Hoje vou falar sobre pools de conexão de banco de dados. Para ser sincero, eu disse que a pera de pato é muito grande. Porque os pools de conexões são relativamente difíceis de entender comparados a outros capítulos. Quero explicar isso para você nas frases mais populares, mas não é uma tarefa fácil. No entanto, pools de conexão também são um ponto de conhecimento muito importante, especialmente ao implantar programas multiusuário. Portanto, não só preciso falar, mas também falar com profundidade. Através deste artigo, você entenderá os fundamentos do connection pooling e como ele já é aproveitado para melhorar o desempenho da sua aplicação.
Índice O que é um pool de conexão? Como funciona o pool de conexões Vamos falar sobre algumas propriedades muito importantes dos pools de conexão Exceções do pool de conexões e métodos de tratamento Uma forma de monitorar o status da sua conexão Princípios básicos para uso eficiente de pools de conexão 1. O que é um pool de conexão? No artigo anterior, "ADO.NET Você Precisa Saber (4) Objetos de Conexão do Gosto", enfatizei que estabelecer uma conexão com banco de dados é algo muito demorado (demorado) e trabalhoso (que consome recursos). Isso porque conectar-se a um servidor de banco de dados envolve vários processos longos: estabelecer um canal físico (como um socket ou pipeline nomeado), fazer um handshake inicial com o servidor, analisar as informações da string de conexão, fazer o servidor autenticar a conexão, executar uma verificação para registrar na transação atual, e assim por diante. Independentemente do motivo de existir tal mecanismo, sempre há uma razão para existir. Como criar uma nova conexão é tão dolorosa, por que não reutilizar uma já existente?
Na verdade, ADO.NET já nos dá um método de otimização chamado conexão pooling. Um pool de conexões é um desses contêineres: ele abriga um certo número de conexões físicas com o servidor de banco de dados. Portanto, quando precisamos nos conectar ao servidor de banco de dados, só precisamos tirar uma conexão livre do pool (container) em vez de criar uma nova. Isso reduz muito a sobrecarga de conexão ao banco de dados, o que melhora o desempenho da aplicação.
PS:本来做了2张图片来描述连接池的,无奈公司装有监控软件,不能上传,所以只能等下次有时间上传了。
2. Como funciona o pool de conexões 2.1 Criar um pool de conexão Deve-se notar que os pools de conexão são sensíveis à classe. Ou seja, o mesmo domínio de aplicação pode ter vários tipos diferentes de pools de conexão ao mesmo tempo. Então, como os pools de conexão são identificados? Em detalhes, ele é distinguido pela assinatura que forma o processo, o domínio da aplicação, a string de conexão e a identidade do Windows (quando usada segurança integrada). No entanto, para o mesmo domínio de aplicação, geralmente é identificado apenas pela string de conexão. Quando uma conexão é aberta, um novo pool de conexões é criado se a assinatura de tipo da conexão em tira não corresponder ao tipo do pool de conexão existente. caso contrário, nenhum novo pool de conexão é criado.
Um exemplo típico de como criar uma conexão:
No caso acima, criei três objetos SqlConnection, mas apenas dois pools de conexão foram necessários para gerenciá-los. Cuidado, amigos, talvez você já tenha descoberto que conn1 e conn3 têm a mesma string de conexão, então podem compartilhar um pool de conexões, enquanto conn2 e conn1 são diferentes do conn3, então você precisa criar um novo pool de conexões.
2.2 Alocação de conexões ociosas Quando um usuário cria uma requisição de conexão ou chama a Abertura de um objeto de Conexão, o gerenciador do pool de conexões precisa primeiro encontrar um pool de conexão do tipo correspondente com base na assinatura do tipo da solicitação de conexão e, em seguida, tentar alocar uma conexão livre. Os detalhes são os seguintes:
Se houver uma conexão disponível no pool, retorne a conexão. Se todas as conexões da piscina estiverem esgotadas, crie uma nova conexão para adicionar à piscina. Se o número máximo de conexões no pool for atingido, a solicitação entra na fila de espera até que haja conexões livres disponíveis. 2.3 Remover conexões inválidas Conexões inválidas, ou seja, conexões que não se conectam corretamente ao servidor de banco de dados. Para pools de conexão, o número de conexões armazenadas no servidor de banco de dados é limitado. Portanto, se conexões inválidas não forem removidas no tempo, o espaço no pool de conexões será desperdiçado. Na verdade, você não precisa se preocupar, o gerente da pool de conexões resolveu esses problemas muito bem para nós. Se uma conexão estiver ociosa por um período prolongado, ou se detectar que a conexão com o servidor está desconectada, o gerenciador do pool de conexões remove a conexão do pool.
2.4 Reciclar conexões usadas Quando terminarmos de usar uma conexão, devemos fechá-la ou liberá-la a tempo para que a conexão possa ser devolvida à piscina para reutilização. Podemos fechar a conexão pelo método Close ou Dispose do objeto Connection, ou pela instrução using em C#.
3. Conte-me sobre alguns atributos muito importantes O comportamento do pool de conexão pode ser controlado por cadeias de conexão e inclui principalmente quatro propriedades importantes:
Tempo de Conexão (Timeout): O tempo para a solicitação de conexão esperar um timeout. O padrão é 15 segundos em segundos. Tamanho máximo do pool: O número máximo de conexões no pool de conexões. O padrão é 100. Tamanho mínimo do pool: O número mínimo de conexões no pool de conexões. O padrão é 0.
Pooling: 是否启用连接池。ADO.NET默认是启用连接池的,因此,你需要手动设置Pooling=false来禁用连接池。 Vamos pegar um exemplo para entender as propriedades do pool de conexão. O código é o seguinte:
4. Exceções de pool de conexão e métodos de tratamento Quando um usuário abre uma conexão sem fechá-la corretamente ou em tempo hábil, isso frequentemente desencadeia o problema de "vazamento de conexão". A conexão vazada permanece aberta até que o método Descarte seja chamado, e o coletor de lixo (GC) fecha e libera a conexão. Diferente do ADO, ADO.NET precisa fechar manualmente as conexões usadas. Um mito importante é que a conexão é fechada quando o objeto conectado está fora do escopo local. Na verdade, quando fora do escopo, apenas o objeto de conexão é liberado, não o recurso de conexão. Bem, vamos dar uma olhada em um exemplo primeiro.
Para deixar os resultados mais óbvios, eu defini especialmente o número máximo de conexões para 5 e o tempo de timeout é de 1 segundo. Após a corrida, os seguintes resultados são obtidos rapidamente.
A partir dos resultados acima, fica claro que há uma anomalia na conexão. Já sabemos que o número máximo de conexões no pool de conexões é 5, e quando a 6ª conexão é criada, é necessário esperar até que ela expire, pois o número máximo de conexões no pool já atingiu o número máximo e não há conexões livres. Quando o tempo de timeout for ultrapassado, a exceção de conexão mencionada acima aparecerá. Portanto, devo enfatizar mais uma vez que as conexões usadas devem ser devidamente fechadas e liberadas o mais rápido possível.
5. Métodos para monitorar o status das conexões SQL Server (1) Por meio do monitor de atividade Passo 1: Abra o Gerenciador MSSMS e clique no ícone "Monitor de Atividade".
Passo 2: Na visualização Monitor de Atividade Aberto, clique na aba Processos.
Passo 3: Execute o exemplo em #4 Exceções e Métodos de Manipulação do Pool de Conexões, você pode ver as 5 conexões abertas como mostrado na figura abaixo.
(2) Uso de instruções T-SQL Da mesma forma, ao executar o procedimento armazenado do sistema sp_who também podemos monitorar o estado da conexão.
6. Princípios básicos para uso eficiente de pools de conexão Aproveitar bem o pool de conexões vai melhorar muito o desempenho da sua aplicação. Pelo contrário, se usado incorretamente, não fará mal. Em geral, os seguintes princípios devem ser seguidos:
Solicite uma conexão no último momento, libere a conexão o quanto antes. Quando fechar a conexão, feche primeiro a transação definida pelo usuário relevante. Garanta e mantenha pelo menos uma conexão aberta no pool de conexões. Tente evitar detritos na piscina. Isso inclui principalmente fragmentação de pools gerada por segurança integrada e fragmentação de pool gerada pelo uso de vários bancos de dados. Dica: A fragmentação de pools é um problema comum em muitas aplicações web, e as aplicações podem criar um grande número de pools que só são liberados até o encerramento do processo. Dessa forma, um grande número de conexões será aberto, consumindo muita memória e resultando em desempenho reduzido.
|