не постижимо; Вы очень можете создавать статические члены. НО, они должны быть помечены как readonly
для сборок, которые имеют PERMISSION_SET
либо SAFE
, либо EXTERNAL_ACCESS
. Только сборка, помеченная как UNSAFE
, может иметь доступные для записи статические элементы. И это ограничение связано с самой природой статических элементов: они разделены между потоками и сеансами.
Сборка загружается при первом обращении к методу внутри нее. Он используется всеми сессиями, поэтому доступны только статические методы. Идея состоит в том, чтобы писать функции, а не приложение, поэтому в поддержании состояния не так много пользы И это может легко (хотя, конечно, не всегда) привести к непредсказуемому поведению, если различные сеансы перезаписывают друг друга. Таким образом, параллелизм вообще не обрабатывается, если вы сами не напишите эту часть.
Следует ожидать, что после загрузки класс (и домен приложения, в котором он находится) будет оставаться в памяти до тех пор, пока служба SQL Server не перезапустится или не изменится значение PERMISSION_SET
. Но это не гарантировано. Согласно этой странице, Использование памяти в SQL CLR :
при наличии нехватки памяти на сервере SQL CLR попытается освободить память путем явного запуска сборки мусора и, при необходимости, выгрузки доменов приложений.
Итак, вы правы в обоих случаях относительно статических членов:
- их можно использовать для кеширования (очень круто)
- они могут быть опаснее:
- они могут вызвать неожиданное поведение
- они могут связать память, поскольку не существует встроенного механизма или естественного события для их очистки, потому что класс остается активным.
И объем памяти, доступный для подпрограмм CLR, сильно варьируется в зависимости от того, является ли SQL Server 32- или 64-разрядным, а также используете ли вы SQL Server 2005/2008/2008 R2 или SQL Server 2012/2014. на сколько памяти SQLCLR нужно играть, посмотрите Память SQL Server 2012 и Использование памяти в SQL CLR (аналогично первой ссылке, размещенной над цитатой).