Поделиться через


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)