Não foi possível ligar à base de dados de sessões do servidor de SQL

A Minha asp.net as aplicações funcionam bem todos os dias. Até o mês passado, meu web começar a obter 2-3 tempo de problema com o sqlsession state server como segue:

Bloco Quote Sistema.Site.HttpException Exception of type ' System.Site.A solução de httpexcepção foi lançada. no sistema.Site.HttpAsyncResult.End() at System.Site.SessionState.Sessionstatemódulo.EndAcquireState (IAsyncResult ar) at System.Site.Aplicação httplication.Como um passo de execução.Uma conclusão rápida(IAsyncResult ar) ================================================== Exceção: Sistema.Site.O HttpException não conseguiu ligar-se à base de dados de sessões do servidor de SQL. no sistema.Site.SessionState.SqlSessionStateStore.Excepção e) no sistema.Site.SessionState.SqlSessionStateStore.SqlStateConnection..ctor (Sqlparitioninfo sqlparitioninfo) at System.Site.SessionState.SqlSessionStateStore.GetConnection (ID de texto, booleano& usePooling) em Sistema.Site.SessionState.SqlSessionStateStore.DoGet (HttpContext context, String id, Boolean getExclusive, Boolean& locked, TimeSpan& lockAge, Object& lockId, SessionStateActions& actionFlags) at System.Site.SessionState.SqlSessionStateStore.GetItemExclusive (HttpContext context, String id, Boolean& locked, TimeSpan& lockAge, Object& lockId, SessionStateActions& actionFlags) no System.Site.SessionState.Sessionstatemódulo.GetSessionStateItem () at Sistema.Site.SessionState.Sessionstatemódulo.PollLockedSessionCallback(estado do Objeto) ================================================== Exceção: Sistema.Expirou o tempo-limite de derrogação de operação inválida. O período de tempo-limite decorreu antes de obter uma ligação da piscina. Isto pode ter ocorrido porque todas as ligações agrupadas estavam em uso e o tamanho máximo da piscina foi atingido. no sistema.Dado.ProviderBase.DbConnectionFactory.GetConnection (DbConnection owningConnection) at Sistema.Dado.ProviderBase.A ligação DBC fechou.OpenConnection (DbConnection outerConnection, DbConnectionFactory connectionFactory) at System.Dado.SqlClient.SqlConnection.Open() at System.Site.SessionState.SqlSessionStateStore.SqlStateConnection..ctor (Sqlparitioninfo sqlparitioninfo)

Então eu comecei a olhar para o meu servidor de sessão db e fiz "exec sp_who" no meu cliente sql que encontrou um monte de registros de operação AspState em resultado.

Não sei o que causa isto. um problema porque não mudamos nada sério. na aplicação para fora, apenas alguns bugs corrigidos.

Aqui está o detalhe dos ambientes das minhas aplicações web:

Asp.net 3.5 (converter de 1.1)... trabalhar muito bem em 2 servidores agrícolas com sqlmode de Estado de sessão.

Alguém sabe deste problema ou faz alguma ideia para investigação? Obrigado.
Author: tongdee, 2009-01-12

6 answers

Isto parece mesmo uma situação em que estás a usar todas as ligações disponíveis na piscina. Verifique o seu código e certifique-se de configurar as ligações da sua base de dados desta forma:
using (SqlConnection cn = new SqlConnection(connectionString))
{
    using (SqlCommand cm = new SqlCommand(commandString, cn))
    {
        cn.Open();
        cm.ExecuteNonQuery(); // or fill a dataset, etc.
    }
}

Uma vez fora desta Declaração de "usar", a ligação será fechada automaticamente.

Fazer isto irá limpar todas as outras ligações de base de dados na sua aplicação e a ligação ao servidor de Estado será capaz de se ligar quando necessário.

 3
Author: grogan31, 2009-04-15 03:21:54

Eu vi este erro exato acontecer quando um desenvolvedor estava usando um alto número de SqldataReaders para obter dados para construir algum tipo de painel, mas ele nunca fechou seus leitores de dados, mesmo que ele tinha o comportamento de comando definido para fechar a conexão. Uma vez que ele fez (via cerco em usar blocos) estes foram embora. Mais uma vez, esta pode não ser a verdadeira causa do seu problema, mas a exaustão da piscina de conexão muitas vezes aponta para conexões que não estão sendo fechadas corretamente.

 2
Author: kd7, 2009-01-12 14:51:38

Não tenho certeza se alguém ainda está olhando para este tópico, mas eu encontrei um artigo interessante sobre o estado de sessão grande e um grande número de sessões simultâneas causando problemas quando os dados estavam sendo removidos (quando a sessão não é mais válida). Dado que a informação aqui está um pouco datada, pode valer a pena investigar. Aqui está o link: http://msmvps.com/blogs/greglow/archive/2007/02/04/improving-asp-net-session-state-database-performance-by-reducing-blocking.aspx

 2
Author: ctc, 2010-08-17 17:20:48
Já faz algum tempo desde que este post foi levantado, mas eu recentemente experimentei esta questão exata em um ambiente de produção e pensei que poderia ser útil para outros no futuro. [2] nós temos um ASP.NET a aplicação web MVC está rodando em .NET 4.5.2, balanceada de carga em dois nós. A aplicação foi configurada para armazenar sessão em um banco de dados ASPState no SQL Server 2012 (Versão 11.0.5058.0). Estávamos a sofrer de tempos de intervalo.

Excepção informacao: Tipo de excepção: Httpexcepção Mensagem de excepção: não é possível ligar-se à base de dados de sessões do servidor de SQL. Expirou o tempo-limite. O período de tempo-limite decorreu antes de obter uma ligação da piscina. Isto pode ter ocorrido porque todas as ligações agrupadas estavam em uso e o tamanho máximo da piscina foi atingido.

Algumas das respostas que estão aqui relacionadas com a garantia de que não há outras fugas de ligação na base de dados são, creio eu, ilusórias. É criado um conjunto de ligações para cada cadeia de conexão distinta, portanto, qualquer correção para conexões a outras bases de dados não teria um efeito benéfico na base de dados de Estado de sessão. Resolvemos isto com duas alterações:
  1. Aumentar o tamanho máximo da piscina ao anular o valor por omissão de 100 na sequência de ligação na web.ficheiro de configuração:

      sqlConnectionString="data source=SERVERNAME;Initial Catalog=AspState;user id=AspStateUser;password=xxxxx;App=xxxx; Max Pool Size=200;" 
    
  2. Era evidente que a base de dados AspState tinha sido criada com a linha de comando.NET 2.0 e, mais importante, o dbo.Sessão extraordinária O SP tem problemas com o bloqueio. Para agravar ainda mais o problema, a tarefa foi configurada para executar este procedimento a cada minuto. A base de dados AspState foi recriada usando a linha de comandos. net 4.0 da seguinte forma::

C:\Windows\Microsoft.NET\Framework\v4.0.30319>aspnet_regsql.exe -ssadd - sstype C-S OURSERVERNAME-d "AspState" - e

Em termos críticos, a versão posterior inclui uma versão melhorada do procedimento DeleteExpiredSessions, que incorpora um cursor que apaga as sessões expiradas uma de cada vez. Também mudamos a programação do trabalho associado para executar a cada hora e não a cada minuto.
 2
Author: abrown, 2016-05-27 14:47:13

Se nenhuma das respostas aqui funcionar, então verifique a ligação em {[[0]} e <sessionState>. No meu caso, actualizei o texto de ligação em <configuration> mas não no estado de sessão para apontar para um servidor SQL diferente.

Simplesmente especificando o texto de ligação correcto em <sessionState> resolveu este mesmo erro.

 2
Author: Nitin A., 2017-07-30 01:18:56
A sua carga aumentou? Você pode ter um monte de conexões porque você tem muito mais usuários usando o sistema.

Uma coisa que podes fazer é optimizar a utilização da tua sessão. Você pode especificar se uma página usa o estado de sessão ou se apenas faz uma leitura. Esta pode ser uma grande poupança preety se você tiver páginas que não usam ou não modificam sessão.

 1
Author: JoshBerke, 2009-01-14 18:48:08