Невозможно подключиться к базе данных сеансов SQL Server - PullRequest
3 голосов
/ 12 января 2009

Мои приложения asp.net работают нормально каждый день. До прошлого месяца мой веб начинал получать 2-3 раза проблемы с сервером состояний Sqlsession как следовать:

Blockquote System.Web.HttpException Исключение типа 'System.Web.HttpException' было сгенерировано. в System.Web.HttpAsyncResult.End () в System.Web.SessionState.SessionStateModule.EndAcquireState (IAsyncResult ar) в System.Web.HttpApplication.AsyncEventExecutionStep.OnAsyncEventCompletion =) (IA) ============================================ Исключение: System.Web.HttpException Не удается подключиться к SQL База данных сессий сервера. в System.Web.SessionState.SqlSessionStateStore.ThrowSqlConnectionException (SqlConnection conn, исключительная ситуация e) в System.Web.SessionState.SqlSessionStateStore.SqlStateConnection..ctor (SqlPartitionInfo sqlPartitionIneb.ll ) в System.Web.SessionState.SqlSessionStateStore.DoGet (контекст HttpContext, идентификатор строки, логическое значение getExclusive, логическое и заблокированное значение, TimeSpan & lockAge, объект & lockId, SessionStateActions & actionFlags) в объекте System.Web.SessionState.SqlStextState () Логические и заблокированные, TimeSpan & lockAge, Object & lockId, SessionStateActions & actionFlags) в System.Web.SessionState.SessionStateModule.GetSessionStateItem () в System.Web.SessionState.SessionStateModule=PollLocked=essionCallback (состояние объекта) = ============================================ Исключение: System.InvalidOperationException Истекло время ожидания. Время ожидания истекло до получения соединения из пула. Это могло произойти из-за того, что все пулы подключений использовались и был достигнут максимальный размер пула в System.Data.ProviderBase.DbConnectionFactory.GetConnection (DbConnection owningConnection) в System.Data.ProviderBase.DbConnectionClosed.OpenConnection (DbConnection outerConnection, DbConnectionFactory connectionFactory) в System.Data.SqlCpention.Sec. SqlSessionStateStore.SqlStateConnection..ctor (SqlPartitionInfo sqlPartitionInfo)

Затем я начал изучать мой сеансовый сервер баз данных и выполнил «exec sp_who» в моем клиенте sql, который нашел много записей об операции AspState.

Я не знаю, что вызывает такие проблемы, потому что мы ничего не изменили в нашем приложении исправлено несколько ошибок.

Вот детали окружения моих веб-приложений:

asp.net 3.5 (конвертировать из 1.1) ... очень хорошо работают в Ферма из 2 серверов с режимом sqlmode состояния сеанса.

Кто-нибудь знает об этой проблеме или получает какие-либо идеи для расследования? Спасибо

Ответы [ 6 ]

3 голосов
/ 15 апреля 2009

Это действительно похоже на ситуацию, когда вы используете все доступные соединения в пуле. Просмотрите ваш код и убедитесь, что вы настроили соединения с базой данных следующим образом:

using (SqlConnection cn = new SqlConnection(connectionString))
{
    using (SqlCommand cm = new SqlCommand(commandString, cn))
    {
        cn.Open();
        cm.ExecuteNonQuery(); // or fill a dataset, etc.
    }
}

Как только из этого оператора "using" соединение будет закрыто автоматически.

Выполнение этого приведет к очистке всех других подключений к базе данных в вашем приложении, и подключение к State Server сможет подключаться при необходимости.

2 голосов
/ 30 июля 2017

Если ни один из ответов здесь не работает, то проверьте connectionString в <configuration> и <sessionState>. В моем случае я обновил строку подключения в <configuration>, но не в состоянии сеанса, чтобы указать на другой сервер SQL.

Простое указание правильной строки подключения в <sessionState> разрешило эту же ошибку.

2 голосов
/ 27 мая 2016

Прошло довольно много времени с тех пор, как этот пост был впервые поднят, но я недавно столкнулся с этой проблемой в производственной среде и подумал, что она может быть полезна для других в будущем.

У нас есть веб-приложение ASP.NET MVC, работающее в .NET 4.5.2 с балансировкой нагрузки между двумя узлами. Приложение было настроено для хранения сеанса в базе данных ASPState на SQL Server 2012 (версия 11.0.5058.0). Мы страдали от перерывов:

Информация об исключении: Тип исключения: HttpException Сообщение об исключении: невозможно подключиться к базе данных сеансов SQL Server. Тайм-аут истек. Время ожидания истекло до получения соединения из пула. Это могло произойти из-за того, что все пул соединений использовался и был достигнут максимальный размер пула.

Некоторые ответы здесь, касающиеся того, чтобы убедиться, что в кодовой базе нет других утечек соединений, я считаю, ошибочны. Пул соединений создается для каждой отдельной строки соединения, поэтому любые исправления для соединений с другими базами данных не окажут благотворного влияния на базу данных состояния сеанса.

Мы решили это с двумя изменениями:

  1. Увеличение максимального размера пула путем переопределения значения по умолчанию 100 в строке подключения в файле web.config:

      sqlConnectionString="data source=SERVERNAME;Initial Catalog=AspState;user id=AspStateUser;password=xxxxx;App=xxxx; Max Pool Size=200;" 
    
  2. Было очевидно, что база данных AspState была создана с помощью командной строки .NET 2.0 и, что важно, у dbo.DeleteExpiredSessions SP есть проблемы с блокировкой. Чтобы еще больше усугубить проблему, задание было настроено на выполнение этой процедуры каждую минуту. База данных AspState была воссоздана с использованием командной строки .NET 4.0 следующим образом:

C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319> aspnet_regsql.exe -ssadd - sstype c -S НАШЕ НАЗВАНИЕ -D "AspState" -E

Крайне важно, что более поздняя версия включает в себя улучшенную производительность версии процедуры DeleteExpiredSessions, которая включает в себя курсор, который удаляет истекшие сеансы по одному. Мы также изменили график выполнения соответствующего задания для выполнения каждый час, а не каждую минуту.

2 голосов
/ 17 августа 2010

Не уверен, что кто-то еще просматривает этот поток, но я нашел интересную статью о большом состоянии сеанса и большом количестве одновременных сеансов, вызывающих проблемы при удалении данных (когда сеанс больше не действителен). Конечно, информация здесь немного устарела, возможно, стоит посмотреть на нее. Вот ссылка: http://msmvps.com/blogs/greglow/archive/2007/02/04/improving-asp-net-session-state-database-performance-by-reducing-blocking.aspx

2 голосов
/ 12 января 2009

Я видел эту точную ошибку, когда разработчик использовал большое количество SqldataReaders для получения данных для создания своего рода панели мониторинга, но он никогда не закрывал свои устройства чтения данных, даже если ему было присвоено поведение команды CloseConnection. Как только он сделал (через вложение в использовании блоков), они ушли. Опять же, это может не быть реальной причиной вашей проблемы, но исчерпание пула соединений часто указывает на то, что соединения не закрываются должным образом.

1 голос
/ 14 января 2009

Увеличился ли ваш груз? У вас может быть много соединений, потому что у вас гораздо больше пользователей, использующих систему.

Одна вещь, которую вы можете сделать, это оптимизировать использование вашего сеанса. Вы можете указать, использует ли страница состояние сеанса или просто читает. Это может быть очень большой экономией, если у вас есть страницы, которые не используют или не изменяют сеанс.

...