.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.
OLE DB
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
Atributo | Descrição |
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. |
OLE DB
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 ?
Infelizmente este será um assunto que irei tratar em outro artigo...
Até breve...
José Carlos Macoratti