Como usar DbContext Pooling no Entity Framework Core — #TiagoTartari
Boas,
No artigo anterior falei sobre como usar Batching no Entity Framework Core e os ganhos em performance que ele pode oferecer em sua aplicação.
Neste artigo quero abordar sobre mais uma novidade no EF Core, o DbContext Pooling.
Como sabemos, conceitualmente um pool de conexões é uma forma de reaproveitarmos as conexões que são estabelecidas com o banco de dados em requisições futuras e o propósito é garantir o desempenho da aplicação.
Com a utilização do DbContext Pooling vamos garantir o reaproveitamento de um DbContext, ou seja, no momento que uma instância DbContext for solicitada, primeiro vamos verificar se há uma instância já disponível no pool.
Depois que o processamento da solicitação for finalizada, qualquer estado na instância será redefinido e a instância volta para o pool.
No ASP .NET Core registramos o DbContext por injeção de dependência e no caso para usarmos DbContext Pooling não será diferente, iremos também utilizar a injeção de dependência, mas de maneira diferente.
Para usar o DbContext Pooling, use o AddDbContextPool, em vez de usar AddDbContext, durante o registro na injeção de dependência.
Como fiz o teste
Primeiro instalei o pacote do Entity Framework Core usando o seguinte comando PM> Install-Package Microsoft.EntityFrameworkCore.SqlServer
Estamos usando também o Kestrel que é o novo Web Server da Microsoft feito para suportar multiplataforma.
Em seguida criei um DbContext, onde todas as informações para conexão estão sendo feitas via injeção de dependência.
Na sequência fiz o registro do DbContext via injeção de dependência que é nativa dentro do ASP .NET Core, fiz um exemplo utilizando Pooling e outro sem.
Logo após usando Apache Bechmarking Tool simulei uma carga no site com o seguinte cenário 10.000 requisições distribuídas em 100 usuários, ou seja, por usuário um total de 100 requisições.
Para mostrar as requisições que são feias no banco de dados, simulei uma consulta de todos os clientes da base e também todos os aniversariantes do mês.
Abaixo temos o resultado feito baseado na ferramenta Apache Bechmarking Tool sem usar Pooling.
Agora, nosso teste será utilizando Pooling.
Conseguimos perceber um bom ganho no total de requisições por segundo, tempo por request, bem legal o resultado.
Somente um ponto de atenção ao utilizar DbContext Pooling é que se você já tiver implementado algum gerenciamento de estado existe uma grande probabilidade de um conflito.
Até a próxima