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 / 66200
Accepted
James Lupolt
James Lupolt
Asked: 2014-05-30 12:49:38 +0800 CST2014-05-30 12:49:38 +0800 CST 2014-05-30 12:49:38 +0800 CST

Como solucionar problemas "o driver do cliente enviou várias solicitações enquanto a sessão está no modo de usuário único"

  • 772

Estou trabalhando com um desenvolvedor que está lutando para interromper o seguinte erro:

O servidor interromperá a conexão porque o driver cliente enviou várias solicitações enquanto a sessão está no modo de usuário único. Esse erro ocorre quando um cliente envia uma solicitação para redefinir a conexão enquanto ainda há lotes em execução na sessão ou quando o cliente envia uma solicitação enquanto a sessão está redefinindo uma conexão. Entre em contato com o fornecedor do driver do cliente.

Quando esse erro ocorre, um resultado típico é uma sessão que está mantendo bloqueios, mas não tem nenhum SQL em execução (nenhuma linha sys.dm_exec_requestspara o session_id) e causa bloqueio até que seja eliminado. A causa do bloqueio é direta, mas como impedir que o erro ocorra não é.

Alguns fatos sobre o problema:

  • O cliente está usando Entity Framework (sim, eu sei...), com MARS habilitado (sim, eu sei...)
  • A versão do SQL Server é 10.00.5844 (SQL Server 2008 SP3 CU12). Eles provavelmente não atualizarão as versões principais sem testes extensivos, mas a aplicação de uma CU mais recente é viável.
  • O programa cliente aparece sys.dm_exec_connectionscomo .Net SqlClient Data Provider
  • A conexão aberta parece definitivamente ter o MARS ativado, como net_transportnos sys.dm_exec_connectionsshows Session.
  • Disseram-me que a string de conexão do aplicativo tem processamento assíncrono ativado, de acordo com o comentário de Matt Neerincx neste tópico (não tenho acesso aos servidores de aplicativos para confirmar isso sozinho):

Se você definir Async=true na cadeia de conexão, isso deve evitar esse problema. Se você estiver usando MARS e usando a mesma conexão em vários threads simultâneos, o que pode acontecer é que a chamada para redefinir a conexão pode ficar um pouco atrasada e acionar esse erro. Se você definir Async=true, executaremos um bloqueio adicional no driver cliente para evitar que isso aconteça.

Mais informações sobre esse erro são escassas. Parece sugerir que o programa do cliente está chamando sp_reset_connectionenquanto um lote ainda está em execução. Eu poderia configurar um rastreamento para confirmar isso, mas teria que registrar muitas atividades não relacionadas e o problema está acontecendo apenas uma vez a cada poucos dias. Além disso, não tenho certeza se o desenvolvedor seria capaz de tirar proveito dessa evidência para resolver o problema.

Existe alguma outra técnica que eu possa usar como DBA ou administrador de sistema para solucionar isso ainda mais, ou qualquer coisa que eu possa sugerir ao desenvolvedor que possa fornecer a ele informações úteis ou tornar o problema menos provável de acontecer?

sql-server entity-framework
  • 1 1 respostas
  • 10001 Views

1 respostas

  • Voted
  1. Best Answer
    Solomon Rutzky
    2015-09-30T10:54:09+08:002015-09-30T10:54:09+08:00

    Não vejo em lugar nenhum qual versão do .NET Framework está sendo usada, mas como essa pergunta foi feita em maio de 2014 e o .NET Framework versão 4.5 foi lançado em 15/08/2012, o seguinte nota em SqlConnection.ConnectionString para a palavra-chave Asynchronous Processing/ Asyncparece relevante:

    Essa propriedade é ignorada a partir do .NET Framework 4.5.

    Portanto, pode ser útil descobrir a versão exata do Entity Framework que está sendo usada e a versão de destino do .NET Framework.

    No entanto, parece que esse problema pode ser resultado do pool de conexões. Suspeito do pool de conexões porque, após a mensagem de erro sobre o fechamento da conexão, a sessão ainda estava ativa.

    A primeira coisa a tentar é simplesmente desabilitar o pool de conexões adicionando o seguinte à string de conexão:

    Pooling=false;
    

    Se o problema nunca mais voltar, provavelmente esse foi o problema. Hesito em dizer que esse era o problema, pois não é exatamente uma prova. Poderia ter apenas reduzido a frequência de "uma vez a cada poucos dias" para uma vez a cada poucas semanas ou até meses. Mas, se isso melhorar as coisas, mas o aplicativo acessar o servidor com frequência e você preferir usar o pool de conexões, se possível, tente reintroduzir o pool de conexões, mas em sentido limitado: você pode definir um valor baixo para o Connection Lifetimepalavra-chave:

    Connection Lifetime=2;
    

    Isso fará com que as conexões sejam fechadas ao retornar ao pool de conexões, se tiverem mais de 2 segundos. Isso permite que uma série de execuções de consultas rápidas ocorram sem que cada uma delas gaste tempo estabelecendo a conexão, ao mesmo tempo em que não permite que a conexão permaneça por aí, possivelmente segurando bloqueios, etc.

    Mesmo que o erro ainda ocorra, por não ter um pool de conexões mantendo a sessão e a conexão vivas, isso deve permitir uma limpeza adequada, liberação de bloqueios etc.


    Só para deixar claro, já que foi questionado nos comentários sobre a questão: Multiple Active Result Sets (MARS) é usado pelo Entity Framework para fazer Lazy Loading. Portanto, se o aplicativo foi desenvolvido para usar o Lazy Loading, desativar o MARS não é uma opção.

    • 5

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