Одно из наших приложений окон VS .NET 2008 запускается с нескольких клиентских машин. В приложении случайным образом возникают ошибки входа в систему из случайных машин и из случайных мест в коде. Логин работает почти каждый раз, но примерно раз в пятнадцать минут в журналах ошибок SQL Server появляется ошибка от случайного пользователя. Мы работаем в кластерной системе SQL Server 2005, а база данных находится в режиме 2005 (90).
В журналах ошибок SQL Server появляется следующая ошибка:
Не удалось войти в систему для "App_Login". [КЛИЕНТ: XXX.XXX.X.XXX] Ошибка: 18456, уровень серьезности: 14, состояние: 16.
Клиент видит следующую ошибку:
System.Data.SqlClient.SqlException: при отправке запроса на сервер произошла ошибка транспортного уровня. (поставщик: поставщик TCP, ошибка: 0 - существующее соединение было принудительно закрыто удаленным узлом.)
Строка подключения, используемая приложением:
Data Source=XX.XXX.XXX.XXX;Network Library=DBMSSOCN;Initial Catalog=document7;User Id=App_Login;Password=PASSWORDHERE;
(ПРИМЕЧАНИЕ: XXX.XXX.X.XXX и XX.XXX.XXX.XXX - IP-адреса)
Спасибо за ваше время и любую помощь!
В данном случае я думаю, что ошибка SQL Server не так показательна, как ошибка клиента. В сообщении об ошибке клиента указано, что соединение уже существует и было разорвано, что, на мой взгляд, является более точным описанием происходящего. Это сообщение в блоге объясняет проблему.
По сути, соединение в пуле было разорвано по какой-то причине (возможно, из-за отсутствия активности или, возможно, из-за сбоя сети), и клиент не знает, что соединение было разорвано, пока он не запустит другой запрос, используя его. Это объясняет, почему эта проблема возникает только с нашим приложением Windows Form, потому что это приложение будет оставлять соединения неактивными на гораздо более длительные периоды, чем другие приложения. Кроме того, веб-приложение находится в том же физическом месте, что и сервер базы данных, поэтому проблем с подключением по сети не будет.
Чтобы решить эту проблему, мне просто нужно проверить наличие ошибки и повторно запустить запрос во второй раз. Запрос должен сработать во второй раз, потому что он автоматически получит новый SPID и новое соединение.
чек этот блог. Обязательно ознакомьтесь с комментариями и обсуждениями ниже, в одном из которых говорится:
"(Ошибка: 18456, уровень серьезности: 14,) Состояние: 16 означает, что входящий пользователь не имеет разрешений на вход в целевую базу данных. Например, вы создаете пользователя FOO и устанавливаете базу данных FOO по умолчанию как master, но FOO делает у вас нет прав для входа в мастер ".