Проблемы с кодом CLR на Sql Server 2005 - PullRequest
0 голосов
/ 02 марта 2009

Я рассматриваю доступ к некоторому коду CLR из UDF в Sql Server 2005.

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

Очевидно, что моя функция будет содержать блок try-catch. Однако некоторые исключения (stackoverflow) могут пропускать улов.

Есть ли у кого-нибудь набор руководящих принципов, которые могут полностью исключить (или минимизировать) риск сбоя моего кода CLR.

Ответы [ 4 ]

2 голосов
/ 02 марта 2009

Необработанные исключения оказывают неблагоприятное влияние на SQL Server, но насколько они зависят от серьезности создаваемого исключения.

Вообще говоря, вы используете Области ограниченного выполнения, чтобы указать область (процесс, домен приложения, поток и т. Д. И т. Д.), На которую может повлиять фрагмент кода при сбое. SQL Server использует это, чтобы определить, следует ли просто прервать текущий запрос / запрос или пойти дальше в случае более серьезной ошибки.

В журнале MSDN есть хорошая статья, в которой рассказывается о CER, а также о том, как их использует SQL Server:

http://msdn.microsoft.com/en-us/magazine/cc163716.aspx#

Кроме того, вот список рекомендаций, специально предназначенных для разработки кода CLR для SQL Server:

http://msdn.microsoft.com/en-us/library/ms228970.aspx#

0 голосов
/ 02 марта 2009

Необработанные исключения в коде CLR не приведут к остановке сервера. Код CLR выполняется в отдельном домене приложения и является изолированным. Максимум, что может случиться (и это маловероятно), - это то, что исключение приведет к сбою домена приложения и вызовет его выгрузку. Это может сделать либо: а) перезагрузку при следующем запросе, либо б) отключение до тех пор, пока проблема не будет устранена или не будет развернута новая версия сборки.

Таким образом, самое большее, эта конкретная сборка CLR будет отключена, а вызывающие сеансы будут получать сообщения об ошибках. Крайне маловероятно, что неисправный код CLR повредит весь экземпляр сервера sql; если это произойдет, я бы сказал, что это ошибка Microsoft, а не ошибка функции CLR или хранимой процедуры.

Весьма вероятным случаем является то, что необработанное исключение .net будет преобразовано в сообщение об ошибке tsql. Самое большее, соединение tsql будет разорвано; скорее всего, это приведет к сообщению об ошибке.

0 голосов
/ 02 марта 2009

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

http://msdn.microsoft.com/en-us/library/ms181714.aspx

WITH( MAXDOP 1)
0 голосов
/ 02 марта 2009

Что делает код?

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

...