Estou trabalhando com um aplicativo de 3 camadas, Microsoft Dynamics AX, onde a camada intermediária mantém conexões com um SQL Server. Vários clientes se conectam a esse servidor de camada intermediária.
O servidor de camada intermediária normalmente tem várias conexões abertas com o SQL Server, então tenho certeza de que elas estão sendo agrupadas, no entanto, não há documentação disponível sobre como isso é implementado.
Normalmente não podemos relacionar SPIDs a usuários ou aplicações clientes, mas existe uma opção onde podemos definir uma chave de registro (específica do Microsoft Dynamics AX) que disponibiliza esta informação no context_info
campo sys.dm_exec_sessions
.
Novamente, não há documentação sobre como isso é implementado. A única informação que temos sobre isso é uma vaga entrada de blog no MSDN.
A postagem menciona
Adicionar essas informações tem uma pequena sobrecarga de desempenho.
Portanto, como não sabemos nenhum dos detalhes da implementação, como:
- As informações estão de alguma forma incluídas na string de conexão ou isso é feito por SET CONTEXT_INFO?
- Quando as conexões são reutilizadas?
- Que impacto exato pode ser esperado
Existe alguma maneira de determinar do lado do servidor como o pool de conexões está funcionando e qual é o impacto do context_info?
atualização:
Usando esta consulta daqui
SELECT des.program_name,
des.login_name,
des.host_name,
-- der.database_id,
COUNT(des.session_id) AS [Connections]
FROM sys.dm_exec_sessions des
INNER JOIN sys.dm_exec_connections DEC
ON des.session_id = DEC.session_id
WHERE des.is_user_process = 1
--AND des.status <> 'running'
GROUP BY des.program_name,
des.login_name,
des.host_name
-- ,der.database_id
HAVING COUNT(des.session_id) > 2
ORDER BY COUNT(des.session_id) DESC
Eu posso ver que o pool de conexões é usado.
Primeiro,
CONTEXT_INFO
é uma propriedade da sessão, não da conexão. Ele é redefinido por sp_reset_connection quando a mesma sessão é reutilizada e o primeiro lote é executado. Parece que nãoCONTEXT_INFO
foi redefinido no SQL Server 2000 e possivelmente em versões anteriores, mas a partir do SQL Server 2005 é definitivamente redefinido para .NULL
Parte da confusão aqui é que a pergunta é específica para "Microsoft Dynamics AX", já que a programação geral do .NET não teria a chave de registro indicada naquele artigo do blog. Além disso, as informações que o Microsoft Dynamics está armazenando
CONTEXT_INFO
são os detalhes da sessão do aplicativo, que não têm nada a ver com os SPIDs do SQL Server e não podem ser usados para inferir que o pool de conexões está ocorrendo, pois a sessão do aplicativo abrangerá naturalmente várias conexões, bem como os SPIDs .O mecanismo que está sendo usado para definir
CONTEXT_INFO
praticamente deve ser uma consulta adicional separada executada antes de qualquer outra consulta para essa sessão. Algo na linha de:Portanto, a pequena quantidade de sobrecarga adicional incorrida para permitir que essas informações sejam definidas vem da execução dessa consulta adicional.
Em segundo lugar, você pode testar o pool de conexões usando o SQL Server Profiler. Selecione o evento "RPC:Completed" na categoria "Stored Procedures", certifique-se de que "TextData", "ClientProcessID" e "SPID" estejam marcados para esse evento (no mínimo, você pode selecionar outras colunas, se desejar ). Em seguida, vá em "Filtros de coluna", selecione "TextData" e na condição "Curtir" adicione a seguinte condição:
exec sp[_]reset[_]connection
. Agora execute esse rastreamento. Se você vir instâncias de exec sp_reset_connection chegando, isso se deve ao uso do pool de conexões.Além disso, há dois efeitos colaterais do pool de conexões que podem ou não aparecer nos DMVs, dependendo de quantas conexões estão sendo solicitadas. A consulta a seguir deve capturar muitas / a maioria das conexões agrupadas (observe que não tem nada a ver com CONTEXT_INFO):
Esta consulta procura as seguintes indicações de uso do pool de conexões:
SqlCommand
s.Em linhas semelhantes, também deve ser possível testar o pool de conexões criando uma tabela temporária e, a cada poucos segundos, capturando
[session_id]
(INT) e[connection_id]
(UNIQUEIDENTIFIER) desys.dm_exec_connections
. Em seguida, basta procurar linhas que tenham o mesmo connection_id, mas diferentes session_id.Por fim, a consulta postada na pergunta não é válida para indicar o pool de conexões com relação à maioria dos aplicativos da web. O problema aqui é que, normalmente, as propriedades de "program_name", "login_name" e "host_name" seriam as mesmas para todas as conexões feitas pelo servidor web/aplicativo (daí a necessidade dos modelos de licenciamento por processador/núcleo em vez de apenas ter o modelo CAL).
Em relação ao Pool de conexão, Thomas Stringer postou: http://blogs.msdn.com/b/sql_pfe_blog/archive/2013/10/08/connection-pooling-for-the-sql-server-dba.aspx
A coisa simples a saber é: "A resposta que os DBAs corporativos precisam dar a essas perguntas é que ela é específica do provedor. Em outras palavras, é no lado do cliente/aplicativo que o pool de conexões é tratado."
O CONTEXT_INFO, que é armazenado em binário, precisa ser definido pelo aplicativo. CONTEXT_INFO é apenas um pequeno depósito disponível para conter informações úteis, como o Nome/ID/Login do usuário. (Ou o que mais você quiser colocar no pequeno espaço disponível.)
A sobrecarga é pequena, mas é uma etapa extra para inserir e extrair os dados BINARY em CONTEXT_INFO. (Mas útil para sistemas que rodam sob uma conta de serviço, para que você possa saber de quem é a conexão no momento.)
Obrigado a srutzky por esclarecer que uma conexão em pool é redefinida, mas não é descartada. Pelo menos não imediatamente.
Uma postagem de Nacho Alonso Portillo oferece esclarecimentos: http://blogs.msdn.com/b/ialonso/archive/2012/06/04/how-to-determine-whether-a-connection-is-pooled-or-nonpooled .aspx
Em parte diz que o "sp_reset_connection... faz as seguintes tarefas: 1) limpa o contexto da sessão... que inclui... redefine o CONTEXT_INFO;... 2) notifica-os da ocorrência de um logout bem-sucedido.. . 3) inicia o processo de refazer o login."