sys.dm_clr_appdomains (Transact-SQL)
Возвращает строку на каждый домен приложения на сервере. Домен приложения (AppDomain) представляет собой конструкцию в среде Microsoft .NET Framework Common Language Runtime, являющейся единицей изоляции для приложения. С помощью этого представления можно анализировать работу объектов интеграции со средой CLR, выполняющихся в Microsoft SQL Server, и устранять возможные неполадки.
Существует несколько типов управляемых объектов CLR для баз данных. Общие сведения об этих объектах см. в разделе Построение объектов базы данных с интеграцией со средой CLR. Когда эти объекты выполняются, SQL Server создает домен приложений, в котором он может загружать и выполнять требуемый код. Уровень изоляции домена приложений — один домен на одну базу данных одного владельца. Таким образом, все объекты среды CLR, принадлежащие одному пользователю, всегда выполняются в том же домене приложений. Домен приложений не уничтожается после завершения выполнения кода. Вместо этого он кэшируется в памяти для последующего использования. Это повышает производительность.
Дополнительные сведения см. в разделе Домены приложений.
Имя столбца |
Тип данных |
Описание |
---|---|---|
appdomain_address |
varbinary(8) |
Адрес домена приложений. Все управляемые объекты базы данных, принадлежащие пользователю, всегда загружаются в одном и том же домене приложений. С помощью этого столбца можно просматривать все сборки, загруженные на данный момент в этом домене приложений, в представлении sys.dm_clr_loaded_assemblies. |
appdomain_id |
int |
Идентификатор домена приложений. Каждый домен приложений имеет уникальный идентификатор. |
appdomain_name |
varchar(386) |
Имя домена приложений, назначаемое SQL Server. |
creation_time |
datetime |
Время создания домена приложений. Поскольку домены приложений кэшируются и используются повторно для повышения производительности, поле creation_time не обязательно содержит время выполнения кода. |
db_id |
int |
Идентификатор базы данных, в которой был создан этот домен приложений. Код, хранимый в двух разных базах данных, не может совместно использовать один домен приложений. |
user_id |
int |
Идентификатор пользователя, объекты которого могут выполняться в домене приложений. |
состояние |
nvarchar(128) |
Описание для текущего состояния AppDomain. Домен приложения может быть в различных состояниях — от создания до удаления. Дополнительные сведения см. в подразделе «Примечания». |
strong_refcount |
int |
Количество жестких ссылок на AppDomain. Отражает количество выполняющихся в данный момент пакетов, использующих этот домен приложений. Учтите, что выполнение этого представления создаст счетчик жестких ссылок; даже если никакой код в данный момент не выполняется, strong_refcount будет иметь значение 1. |
weak_refcount |
int |
Количество слабых ссылок на домен приложений. Указывает, сколько кэшировано объектов в домене приложений. При выполнении управляемого объекта базы данных SQL Server кэширует его в домене приложений для повторного использования в будущем. Это повышает производительность. |
cost |
int |
Стоимость домена приложений. Чем выше стоимость, тем больше вероятность, что этот домен приложений будет выгружен при недостатке свободной памяти. Стоимость обычно зависит от объема памяти, который требуется для повторного создания этого домена приложений. |
value |
int |
Значение AppDomain. Чем ниже значение, тем больше вероятность, что этот домен приложений будет выгружен при недостатке свободной памяти. Значение обычно зависит от количества соединений или пакетов, использующих этот домен приложений. |
Замечания
Между dm_clr_appdomains.appdomain_address и dm_clr_loaded_assemblies.appdomain_address существует связь типа «один к многим».
В следующих таблицах перечислены возможные значения столбца state, а также их описания и моменты появления в жизненном цикле домена приложений. С помощью этой информации можно отслеживать жизненный цикл домена приложений, контролировать подозрительную или повторяющуюся выгрузку экземпляров домена приложений без необходимости анализировать журнал событий Windows.
Инициализация домена приложений
Состояние |
Описание |
---|---|
E_APPDOMAIN_CREATING |
Домен приложений создается. |
Использование домена приложений
Состояние |
Описание |
---|---|
E_APPDOMAIN_SHARED |
Домен приложений времени выполнения готов для использования несколькими пользователями. |
E_APPDOMAIN_SINGLEUSER |
AppDomain готов для использования в операциях DDL. Это отличается от E_APPDOMAIN_SHARED, в котором используется общий домен приложения для выполнения интеграции CLR в качестве противопоставления операциям DDL. Такие домены приложения изолированы от остальных текущих операций. |
E_APPDOMAIN_DOOMED |
Для домена приложений запланирована выгрузка, однако в данный момент в нем выполняются потоки. |
Очистка домена приложений
Состояние |
Описание |
---|---|
E_APPDOMAIN_UNLOADING |
SQL Server запросил у среды CLR выгрузку домена приложений. Обычно это происходит потому, что сборка, содержащая управляемые объекты базы данных, была изменена или удалена. |
E_APPDOMAIN_UNLOADED |
Среда CLR выгрузила домен приложений. Обычно это происходит в результате процедуры расширения, произошедшей вследствие ошибок ThreadAbort, OutOfMemory или необработанного исключения в пользовательском коде. |
E_APPDOMAIN_ENQUEUE_DESTROY |
Домен приложений выгружен в среде CLR и будет уничтожен SQL Server. |
E_APPDOMAIN_DESTROY |
Домен приложений уничтожается SQL Server. |
E_APPDOMAIN_ZOMBIE |
Домен приложений уничтожен SQL Server, однако не все ссылки на этот домен очищены. |
Разрешения
Требует разрешения VIEW SERVER STATE на базу данных.
Примеры
Следующий пример показывает, как просмотреть подробные сведения о домене приложений для заданной сборки:
select appdomain_id, creation_time, db_id, user_id, state
from sys.dm_clr_appdomains a
where appdomain_address =
(select appdomain_address
from sys.dm_clr_loaded_assemblies
where assembly_id = 500)
Следующий пример показывает, как просмотреть все сборки в заданном домене приложений:
select a.name, a.assembly_id, a.permission_set_desc, a.is_visible, a.create_date, l.load_time
from sys.dm_clr_loaded_assemblies as l
inner join sys.assemblies as a
on l.assembly_id = a.assembly_id
where l.appdomain_address =
(select appdomain_address
from sys.dm_clr_appdomains
where appdomain_id = 15)