Member 11871860 Ответов: 1

База данных Sql случайным образом дает ненормальные ответы на веб-запросы (ASP.NET/VB)


Я разрабатываю веб-сайт asp.net, который использует соединение System.Data.SQLClient для передачи данных между базой данных и веб-приложением. На первый взгляд кажется, что все работает правильно, поскольку все данные отображаются так, как должны, и все функции выполняют ту работу, для которой они предназначены. Однако через случайные промежутки времени - обычно около 24 часов - возникает необычная ошибка: ответы, данные приложению из базы данных, кажутся ненормальными, например, сообщение «Пользователь не найден» всем пользователям приложения, когда они попробуйте войти в систему (они работают правильно до «зависания»!) или сообщение об ошибке «таблица не найдена» для таблицы, которая существует и работала нормально 5 минут назад.
Чтобы заставить приложение работать, я должен обновить веб - сайт либо через IIS - я предполагаю,что это обновляет AppPool-либо повторно загрузить dll-файлы приложения на сервер,ничего не меняя .
Есть какие-нибудь идеи о том, что вызывает эту проблему? Я никогда не испытывал этого раньше, и это расстраивает меня уже довольно давно.

Я использую VB.Net/WebForms и .net framework 4.5.2

Что я уже пробовал:

- Изменение значений таймаута сеанса
- Изменение моих запросов " SELECT...", чтобы они не включали "*"
- Связавшись с моим хостинг-провайдером - они не смогли помочь -
- Проверка, существует ли соединение и / или висит-оно существует/не висит -

1 Ответов

Рейтинг:
4

NightWizzard

Я не могу дать точный указатель на источник ошибки, но из +30-летнего опыта работы с MS SQL и +10-летнего опыта работы с ним .NET я могу сказать, что это не типичное поведение ни для SQL Server, ни для клиентских библиотек SQL .NET. Я бы искал экологические причины, такие как:
- есть ли утечка памяти, приводящая к ошибке нехватки памяти на сервере
- имеет ли экземпляр SQL server достаточно памяти для правильной работы
- выполняет ли сервер задачу резервного копирования в момент ошибки
- периодически ли сервер повторно подключается из-за запланированных действий по обслуживанию
- существует любое задание агента SQL, которое выполняет длительные операции в данный момент.
тайм-аут или тупиковая ситуация для других задач
- ваш сервер предназначен только для вашего сайта ASP или совместно используется с другими сайтами
это может привести к тяжелым действиям сервера
- выполняет ли провайдер какие-либо периодические повторные подключения или сбросы для вашего сервера

Надеюсь, эти идеи помогут найти причину такого странного поведения-goo luck!


Member 11871860

Большое вам спасибо,я постараюсь посмотреть, поможет ли что-нибудь из этого, и сообщу вам позже

Member 11871860

Итак, я нашел проблему... Это связано с тем, что SQL Server выполняет две команды одновременно (например,один пользователь входит в систему, а другой выходит из нее, помните, что мы говорим об одной и той же миллисекунде).
Вход и выход из системы осуществляется двумя SQL-процедурами,каждая из которых имеет свою собственную транзакцию on, которая (транзакция) имеет операторы COMMIT и rollback. (Нет, я не использую аутентификацию форм)
Есть ли конкретное решение для этого вопроса? Потому что раньше со мной такого никогда не случалось...

NightWizzard

Итак, кажется очевидным, что существует тупиковая ситуация, если 2 пользователя входят в систему одновременно из-за SQL-транзакций, которые запускаются тогда. Как вы можете прочитать на веб-сайте Microsoft, полностью избежать тупиков невозможно, но вы можете снизить риск этого с помощью некоторых подсказок, которые вы можете найти здесь:
https://subhrosaha.wordpress.com/2010/06/02/sql-server-avoiding-deadlocks/
или здесь:
http://stackoverflow.com/questions/40585374/preventing-deadlocks-in-sql-server

Есть гораздо больше совпадений, если вы ищете их в google
Т-SQL и избежать тупиковой ситуации
Надеюсь, вы найдете решение своей проблемы - еще раз удачи!

Member 11871860

Итак, проблема решена (или так кажется после двух дней тщательного тестирования):

Я подключался один раз - то есть,когда пользователь открывал веб - сайт, - а затем использовал одно и то же соединение для всего. Таким образом,SQL server обрабатывал каждую команду так,как если бы она отправлялась из одного единственного соединения, что, естественно, вызывало массу тупиков. Проблема была решена путем закрытия и повторного открытия соединения каждый раз, когда я отправлял команду на SQL server: похоже, так и должно быть!

NightWizzard

Я рад, что вы нашли решение этой проблемы. Да, в зависимости от того, как спроектирован уровень базы данных, он может вызвать эти тупики. Может быть, сначала вам следует перейти от клиентской библиотеки SQL к коду Entity Framework? Он прост в интеграции и обрабатывает соединения автоматически. С опцией
MultipleActiveResultSets=True
в строке подключения вы можете иметь одновременный доступ для нескольких одновременных пользователей.