AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 101286
Accepted
Tom V
Tom V
Asked: 2015-05-13 05:28:19 +0800 CST2015-05-13 05:28:19 +0800 CST 2015-05-13 05:28:19 +0800 CST

Verificando o lado do servidor do pool de conexões com CONTEXT_INFO ativado

  • 772

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_infocampo 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:

  1. As informações estão de alguma forma incluídas na string de conexão ou isso é feito por SET CONTEXT_INFO?
  2. Quando as conexões são reutilizadas?
  3. 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.

sql-server connection-pooling
  • 2 2 respostas
  • 1838 Views

2 respostas

  • Voted
  1. Best Answer
    Solomon Rutzky
    2015-05-13T13:49:01+08:002015-05-13T13:49:01+08:00

    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_INFOsã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_INFOpraticamente deve ser uma consulta adicional separada executada antes de qualquer outra consulta para essa sessão. Algo na linha de:

    SqlConnection _Connection = new SqlConnection("{connection-string}");
    _Connection.Open();
    
    if(_IsConnectionContextRegistryKeySet)
    {
      SqlCommand _Command = _Connection.CreateCommand();
      _Command.CommandType = CommandType.Text;
    
      _Command.CommandText = @"DECLARE @BinaryInfo VARBINARY(128);
                               SET @BinaryInfo = CONVERT(VARBINARY(128), @StringInfo);
                               SET CONTEXT_INFO @BinaryInfo;";
    
      SqlParameter _ParamInfo = new SqlParameter("@StringInfo", SqlDbType.VarChar, 100);
      _ParamInfo.Value = String.Format("{0} {1} {2}...", AXuserID, AXsessionID, ...);
      _Command.Parameters.Add(_ParamInfo);
    
      _Command.ExecuteNonQuery();
      _Command.Dispose();
    }
    

    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):

    SELECT sssn.login_time,
           DATEDIFF(MILLISECOND, conn.connect_time, sssn.login_time)
                      AS [MillisecondsBetweenConnectionAndSessionStart],
           conn.*
    FROM sys.dm_exec_connections conn
    INNER JOIN sys.dm_exec_sessions sssn
            ON sssn.session_id = conn.session_id
    WHERE conn.session_id <> conn.most_recent_session_id
    OR    DATEDIFF(MILLISECOND, conn.connect_time, sssn.login_time) > 50
    ORDER BY conn.connect_time;
    

    Esta consulta procura as seguintes indicações de uso do pool de conexões:

    • O session_id atual não é o mesmo que o session_id anterior. Se esses dois IDs forem iguais, pode ou não ser uma conexão que está usando pooling, pois o mesmo SPID pode ser reutilizado. Mas, se forem diferentes, isso só pode ser o resultado do pool de conexões.
    • O tempo entre o estabelecimento da conexão e o início da sessão é superior a 50 milissegundos (embora esse limite possa variar de acordo com o sistema). Normalmente, a primeira sessão a ser criada em uma conexão é inferior a 30 milissegundos após a conexão, mas "geralmente" não deve estar acima de 50, mesmo se estiver executando vários SqlCommands.

    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) de sys.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).

    • 6
  2. RLF
    2015-05-13T07:09:04+08:002015-05-13T07:09:04+08:00

    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."

    • 1

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve