O pool de conexões é mais lento do que manter uma conexão aberta
Eu observei um comportamento interessante do desempenho do pool de conexão em um aplicativo cliente que criamos. Quando o usuário clica em um objeto, mais dados específicos do objeto são carregados do banco de dados. Isso leva entre 10 e 30 consultas por clique, dependendo do objeto.
Isso foi feito usando o pool de conexões e cada consulta foi despachada em uma nova conexão do pool e a conexão foi fechada após a execução da consulta.
Analisei as consultas no profiler para otimização de desempenho e vi que havia muitas entradas de login / logout de auditoria. Além disso, o desempenho não era ideal, apesar de as consultas serem executadas bem (somente operadores de busca / varredura de índice).
Apenas para testar, desabilitei o pooling e modifiquei o código para manter uma conexão por aplicativo cliente e reutilizá-lo. Isso tornou o aplicativo inteiro muito mais responsivo e todas as entradas de login / logout de auditoria desapareceram do profiler.
Como isso é possível? As conexões não devem permanecer abertas ou se elas realmente permanecerem abertas, pelo menos, não sejam tão lentas? É possível que estamos usando a classe SqlConnection errada, resultando em um pool desativado?
Eu li os outros posts sobre pooling, mas não encontrei nada sobre uma diferença de velocidade perceptível entre o pool de conexões e reutilizar a mesma conexão.
SqlConnection con = new SqlConnection(_connectionString);
A conexão é transferida para uma sessão de classe de quebra que fornece funcionalidade transacional.
class Session{
Session(connection);
Abort();
Commit();
}
A conexão é fechada em Abort () e Commit (). Um deles é sempre chamado.