Не исключено; вы очень можете создавать статические элементы. НО, они должны быть помечены как readonly для сборок, которые имеют PERMISSION_SET из SAFE или EXTERNAL_ACCESS. Только сборка, помеченная как UNSAFE, может иметь статические элементы с возможностью записи. И это ограничение связано с самой природой статических членов: они общие совместно используются потоками и сеансами.
Сборка загружается при первом доступе к методу внутри нее. Он является общим для всех сеансов, поэтому доступны только статические методы. Идея состоит в том, чтобы писать функции, а не приложение, поэтому в сохранении состояния не так уж много пользы. И это может легко (хотя, конечно, не всегда) привести к непредсказуемому поведению, если различные сеансы перезаписывают друг друга. Таким образом, параллелизм вообще не обрабатывается, если только вы сами не напишете эту часть.
Следует ожидать, что после загрузки класс (и домен приложения, в котором он находится) останется в памяти до перезапуска службы SQL Server или изменения значения PERMISSION_SET. Но это не гарантируется. Согласно этой странице, Использование памяти в SQL CLR:
при нехватке памяти на сервере SQL CLR попытается освободить память, явно запустив сборку мусора и, при необходимости, выгрузив домены приложений.
Итак, вы правы в обоих случаях относительно статических членов:
- их можно использовать для кеширования (очень круто)
- they can be more dangerous:
- they can cause unexpected behavior
- они могут связывать память, поскольку нет внутреннего механизма или естественного события, чтобы очистить их, потому что класс остается активным.
Кроме того, объем памяти, доступной для подпрограмм CLR, сильно различается в зависимости от того, является ли SQL Server 32- или 64-разрядным, а также от того, используете ли вы SQL Server 2005/2008/2008 R2 или SQL Server 2012/2014. памяти SQLCLR, проверьте память SQL Server 2012 и Использование памяти в SQL CLR (такое же, как первую ссылку, размещенную над цитатой).
person
Solomon Rutzky
schedule
05.12.2014