Clique aqui para ler todos os artigos desta edição
Estratégia de Acesso a Dados no ADO.NET e SQL
por John Papa
Este artigo discute |
Este artigo usa as seguintes tecnologias: |
· Pooling de conexões · Stored Procedures · Declaração de parâmetros · ExecuteScalar, ExecuteReader, DataSet |
C# e SQL Download: |
Chapéu ADO.NET e SQL |
|
Quando sua meta for uma solução empresarial eficiente e escalável, você precisará desenvolver uma estratégia eficiente de acesso a dados. Você não pode apenas testar suas máquinas de produção e depender dos resultados. Embora um aplicativo possa exibir excelentes tempos de resposta para alguns usuários, é possível que haja problemas de desempenho quando a carga aumenta. Por isso, quando sou solicitado a executar revisões de código e de arquitetura, procuro vários modelos de codificação. Neste artigo, compartilharei algumas delas, já que estão relacionadas ao acesso a dados com o ADO.NET. Discutirei maneiras eficientes de implementar as conexões de banco de dados do ADO.NET de modo a aproveitar as vantagens dos pools de conexão e apresentarei dicas sobre como usar os vários objetos ADO.NET para abrir e fechar conexões e para gerenciar o estado da conexão para você. Discutirei também as conexões e o DataAdapter e DataReader, bem como stored procedures, consultas parametrizadas e ataques de injeção SQL.
Conexões ADO.NET
As conexões com os banco de dados são geralmente uma preocupação tardia, o que é surpreendente se considerarmos como elas são essenciais e como podem se tornar facilmente uma fonte de problemas e gargalos. Uma maneira de reduzir o número de conexões e o uso concomitante de seus recursos consiste em reutilizar as conexões por meio do pool de conexões. Para ser capaz de reutilizar uma conexão a partir de um pool, a string de conexão precisa corresponder à string de uma conexão de pool disponível. Cada pool de conexão é associado a uma string de conexão distinta, usando um algoritmo de correspondência exata. Se nenhuma correspondência exata for encontrada, será criada uma nova conexão, a qual será posteriormente incluída no pool.
A Listagem 1 mostra três exemplos de código que abrem uma conexão com o mesmo banco de dados, usando dois usuários diferentes. A primeira conexão é acessada pelo usuário SQL Server™ denominado TestUser1. Presumindo que não haja nenhuma conexão disponível no pool, essa conexão será criada do nada. Posteriormente, essa conexão será fechada e enviada para o pool de conexões. A segunda conexão é acessada por outro usuário SQL Server. A conexão desativada no pool não tem uma correspondência de string de conexão exata, já que os usuários são diferentes. Assim, a segunda conexão é criada do nada, fechada e enviada ao pool de conexões. Em seguida, é aberta uma terceira conexão pelo usuário SQL Server, denominada TestUser1. Existe uma conexão no pool que corresponde exatamente à string de conexão, por isso a conexão é recuperada do pool.
Listagem 1 Pooling de conexões
using(SqlConnection oCn = new SqlConnection(
"Server=(local);Database=Pubs;User ID=TestUser1;Password=foo1;")) {
oCn.Open();
...
}
...