Нужно ли повторно использовать пул приложений для обновления кэшированных планов запросов? - PullRequest
0 голосов
/ 30 мая 2018

Я не уверен, что задаю правильный вопрос точно, но если вы знаете ответ, вы, вероятно, поймете, что я спрашиваю.

Я обновил сохраненный процесс и проверил вDev с / без проблем.Тогда я обновил proc в производстве, и это вызвало ошибки.Мне потребовалось немного времени, чтобы понять, что происходит, потому что все, что я изменил, это поле в списке выбора от i.Price до Price = coalesce(r.Price, i.Price).В конце концов я понял, что единственная разница может заключаться в том, что r.Price - это десятичное значение, тогда как i.Price - это денежное значение, поэтому тип возвращаемого поля изменился.

Обычно это не должно иметь значения для кода c #.значение DataReader преобразуется в десятичное число в любом случае, просто отлично.Но все, что мне нужно было сделать, чтобы исправить ошибку, это сбросить пул приложений, после чего все заработало.Я полагаю, что мог бы также обновить свой запрос, чтобы привести его к типу денег, и это, вероятно, также сработало бы.

Я знаю, что сталкивался с подобным вопросом несколько раз раньше, достаточно знать, что естьв сборках asp.net и / или sql происходит какое-то кэширование.

Мой вопрос: как я могу обновить этот кеш, не перерабатывая пул приложений.Или это единственный способ?

1 Ответ

0 голосов
/ 30 мая 2018

Вот что именно происходит при развертывании:

В ASP.NET имеется функция, называемая теневым копированием, которая позволяет обновлять сборки, используемые в домене приложения, без выгрузки AppDomain.Обычно это требуется, потому что Common Language Runtime (CLR) блокирует сборки, поэтому вы не можете просто скопировать поверх него новую сборку.Теневое копирование означает, что исходная сборка копируется во временную папку.Скопированная сборка заблокирована, и исходная сборка может быть обновлена ​​с помощью новой версии.

Что такое интернирование сборки?

От:

ОтMSDN:

Функция теневого копирования ASP.NET позволяет обновлять сборки, используемые в домене приложения, без выгрузки этого AppDomain (необходимо, поскольку CLR блокирует используемые сборки).Это делается путем копирования сборок приложения в отдельное местоположение (либо в местоположение, определенное CLR по умолчанию, либо в указанное пользователем) и загрузка сборок из этого места.Это позволяет обновлять исходную сборку, пока теневая копия заблокирована.ASP.NET по умолчанию включает эту функцию для сборок папок Bin, так что библиотеки DLL могут продолжать обновляться, пока сайт работает и работает.

https://msdn.microsoft.com/en-us/magazine/hh882452.aspx

Пул приложений будет автоматически перезагруженкогда происходит следующее:

Любые изменения в каталоге BIN приложения

Внесение изменений в любой файл (ы) конфигурации, такие как Web.config или другие (если у вас есть какой-либо конкретный файл конфигурации в вашем приложении, скажитев каталоге с именем App_Config).

Внесение изменений в файлы исходного кода в каталоге APP_CODE.Это может измениться в любых файлах с исходным кодом или добавить или удалить файлы из этого каталога.

Внести изменения в файл Global.asax

Внести изменения в файл Machine.config.

Внесение любых изменений в корневой каталог веб-приложения.Это означает, что создание файлов / подкаталогов на лету может привести к повторному использованию пула приложений.

Модификации для ссылок на веб-службы каталога App_WebReferences.

Изменение параметров безопасности любого каталога в корневом каталоге.(Например, указание прав на чтение для каждого или любого другого конкретного пользователя или группы пользователей.)

Для получения более подробной информации: Вносит ли какое-либо изменение в любой файл внутри папки bin перезапуск приложения в веб-приложении ASP.NET?

...