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.

questionAnswers(1)

yourAnswerToTheQuestion