.NET - Usando Connection Pooling
Já ouviu falar em "pool de conexões" ou connection pool ? Vamos entender afinal o que é isto ...
A idéia por trás de um pool de conexões é otimizar o acesso aos dados através de uma utilização racional das conexões feitas com uma fonte de dados. Afinal uma conexão a uma fonte de dados é consome muito recursos e precisa ser olhada com cuidado.
A técnica do Connection pooling permite a uma aplicação reusar conexões que existem em um pool a invés de repetidamente fechar e criar novas conexões. Isto pode aumentar significativamente o desempenho e a escalabilidade das aplicações pois permite que um menor número de conexões atenda as requisições por conexões de uma aplicação visto que todas as conexões já estão prontas e criadas no pool a espera de serem utilizadas.
Geralmente se cria um pool de conexão para cada string de conexão onde um algoritimo associa itens no pool baseado exatamente na string de conexão; quando pool é criado são criados objetos de conexão e incluídos ao pool para satisfazer o requisito mínimo de tamanho do pool especificado.
Quando uma conexão é requisitada por uma aplicação e o tamanho máximo do pool foi alcançado , a requisição é enfileirada e fica aguardando até que uma conexão seja liberada para uso. A liberação de uma conexão ocorre quando ela é fechada ou liberada , neste momento ela é re-alocada ao pool para ser utilizada novamente. O pool de conexões gerencia as conexões que expiraram e/ou que foram liberadas e fechadas.
O objeto conexão usado deverá ser fechado tão logo quanto possível para que retorne ao pool. Geralmente se faz isto usando os métodos Close() ou Dispose() do objeto Connection. Se uma conexão não for liberada ou fechada ela não pode retornar ao pool.
Nota: Um DataAdapter automaticamente abre e fecha uma conexão quando requerida se ela não estiver aberta ao ser utilizado o método Fill() , FillSchema() , ou Update(). A conexão precisa ser fechada explicitamente se já estiver aberta antes da operação do DataAdapter.
A seguir algumas características de connection pooling para os provedores .NET.
O provedor OLE DB utiliza o pool de conexões através da utilização de recursos fornecidos pelos componentes do núcleo OLE DB. Os serviços padrão OLE DB são fornecidos para um provedor são especificados pelo valor do registro :
HKEY_CLASSES_ROOT\CLSID\<Provider´s CLSID>\OLE_DBSERVICES DWORD.
A tabela a seguir as alternativas possíveis:
Valor de OLE_DBSERVICES Descrição
oxffffffff Todos os serviços.
oxfffffffe Todos os serviços exceto Pooling e Auto-Alistamento
oxfffffffb Todos os serviços. exceto Cursor do lado do Cliente
oxffffffff0 Todos os serviços exceto Pooling , Auto-Alistamento e cursor do lado do cliente
0x00000000 Sem serviços
Controlando as opções de Connectin Pooling
A seguir irei mostrar os atributos da string de conexão que controlam o connection Pooling.
atributos da string de conexão para SQL Server
Connection LifeTime Tempo em segundos depois da criação ser criada logo antes de ter sido destruída. O valor padrão 0 indica que o a conexão terá tempo máximo.
Connection Reset Define se a conexão será redefinida quando removida do pool. O valor padrão é True
Enlist Define se a conexão é automaticamente inscrita no contexto atual da transação da criação da thread se o contexto existir. O valor padrão é true.
Max Pool Size Define o número máximo de conexões permitidas no pool. O padrão é 100.
Min Pool Size Define o número mínimo de conexões permitidas no pool. O padrão é 0
Pooling Define se a conexão virá de um pool ou quando necessário será criada e incluída no pool. O valor padrão é True.
Os recursos de pooling para o provedor OLE DB são controlados usando os valores das entradas do registro. Não existe uma interface com o usuário para configurar estas entradas: o registro precisa ser editado diretamente. Os valores são identificados e definidos por
<Provider´s CLSID>. Os valores CLSID para alguns provedores Microsoft OLE DB são:
SQLOLEDB(SQL Server) HKEY_CLASSES_ROOT\CLSID\{0C7FF16C-38E3-11d0-97AB-00C04FC2AD98}
Microsoft.Jet.OLEDB.4.0(Jet) HKEY_CLASSES_ROOT\CLSID\{dee35070-506b-11cf-b1aa-00aa00b8de95}
MSDAORA(Oracle) HKEY_CLASSES_ROOT\CLSID\{e8cc4cbe-fdff-11d0-b865-00a0c9081c1d}
MSDASQL(OLE DB para ODBC) HKEY_CLASSES_ROOT\CLSID\{c8b522cb-5cf3-11ce-ade5-00aa0044773d}
Lembrando que o gerenciamento do pool de conexões é feito pelos provedores .NET.
A grande questão envolvida é o gerenciamento de conexões inválidas. Quando uma conexão se torna inválida e como eu posso perceber isto antes que seja tarde demais ?