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


sys.dm_clr_appdomains (Transact-SQL)

Область применения: SQL Server

Возвращает строку на каждый домен приложения на сервере. Домен приложения (AppDomain) — это конструкция в среде clR ( среда CLR) Microsoft платформа .NET Framework, которая является единицей изоляции для приложения. Это представление можно использовать для понимания и устранения неполадок объектов интеграции СРЕДЫ CLR, выполняемых в Microsoft SQL Server.

Существует несколько типов управляемых объектов CLR для баз данных. Общие сведения об этих объектах см. в разделе "Создание объектов базы данных с интеграцией среды CLR". При выполнении этих объектов SQL Server создает домен приложения, в котором он может загружать и выполнять обязательный код. Уровень изоляции для домена приложения — это один домен приложения для каждой базы данных на владельца. То есть все объекты CLR, принадлежащие пользователю, всегда выполняются в одном домене приложения для каждой базы данных (если пользователь регистрирует объекты базы данных CLR в разных базах данных, объекты базы данных CLR будут выполняться в разных доменах приложений). Домен приложения не уничтожается после завершения выполнения кода. Вместо этого он кэширован в памяти для будущих выполнений. Это повышает производительность.

Дополнительные сведения см. в разделе "Домены приложений".

Имя столбца Тип данных Description
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 Идентификатор пользователя, объекты которого могут выполняться в этом домене приложения.
state nvarchar(128) Дескриптор текущего состояния домена приложения. Домен приложения может быть в различных состояниях — от создания до удаления. Дополнительные сведения см. в разделе "Примечания" этой статьи.
strong_refcount int Количество надежных ссылок на этот домен приложения. Это отражает количество выполняемых в настоящее время пакетов, использующих этот домен приложения. Выполнение этого представления приведет к созданию строгой ссылки, даже если в данный момент не выполняется код, strong_refcount будет иметь значение 1.
weak_refcount int Количество слабых ссылок на этот домен приложения. Это указывает, сколько объектов внутри AppDomain кэшируются. При выполнении объекта управляемой базы данных SQL Server кэширует его в домене приложения для дальнейшего повторного использования. Это повышает производительность.
cost int Стоимость доменов приложений. Чем выше стоимость, тем более вероятно, что этот домен приложения выгрузится под давлением памяти. Затраты обычно зависят от объема памяти, необходимого для повторного создания этого домена приложения.
значение int Значение домена приложения. Чем ниже значение, тем более вероятно, что этот домен приложения выгрузится под давлением памяти. Значение обычно зависит от количества подключений или пакетов, использующих этот домен приложения.
total_processor_time_ms bigint Суммарное время процессора в миллисекундах, использованное всеми потоками при выполнении в текущем домене приложения с момента запуска процесса. Это эквивалентно System.AppDomain.MonitoringTotalProcessorTime.
total_allocated_memory_kb bigint Общий размер (в килобайтах) всей выделенной памяти, которая была выделена в домене приложения с момента его создания (без вычета освобожденной и собранной памяти). Это эквивалентно System.AppDomain.MonitoringTotalAllocatedMemorySize.
survived_memory_kb bigint Количество килобайт, сохранившихся после последней полной, блокирующей сборки мусора, на которые заведомо существуют ссылки из текущего домена приложения. Это эквивалентно System.AppDomain.MonitoringSurvivedMemorySize.

Замечания

Существует связь "один ко многим" между dm_clr_appdomains.appdomain_address и dm_clr_loaded_assemblies.appdomain_address.

В следующих таблицах перечислены возможные значения состояния , их описания и когда они происходят в жизненном цикле appDomain . Эти сведения можно использовать для отслеживания жизненного цикла приложенияDomain и отслеживания подозрительных или повторяющихся экземпляров AppDomain без анализа журнала событий Windows.

Инициализация домена приложений

State Description
E_APPDOMAIN_CREATING Создается домен приложений.

Использование домена приложений

State Description
E_APPDOMAIN_SHARED Приложение AppDomain среды выполнения готово для использования несколькими пользователями.
E_APPDOMAIN_SINGLEUSER Домен приложения готов к использованию в операциях DDL. Это отличается от E_APPDOMAIN_SHARED, в котором используется общий домен приложения для выполнения интеграции CLR в качестве противопоставления операциям DDL. Такие домены приложения изолированы от остальных текущих операций.
E_APPDOMAIN_DOOMED Приложение AppDomain планируется выгрузить, но в настоящее время в нем выполняются потоки.

Очистка домена приложений

State Description
E_APPDOMAIN_UNLOADING SQL Server запросил, чтобы среда CLR выгрузила домен приложения, как правило, так как сборка, содержащая объекты управляемой базы данных, была изменена или удалена.
E_APPDOMAIN_UNLOADED Среда CLR выгрузила домен приложения. Обычно это результат процедуры эскалации из-за ThreadAbort, OutOfMemory или необработанного исключения в пользовательском коде.
E_APPDOMAIN_ENQUEUE_DESTROY AppDomain был выгружен в среде CLR и установлен для уничтожения SQL Server.
E_APPDOMAIN_DESTROY Домен приложения находится в процессе уничтожения SQL Server.
E_APPDOMAIN_ZOMBIE Домен приложений был уничтожен SQL Server. Однако не все ссылки на домен приложения были удалены.

Разрешения

Требует разрешения VIEW SERVER STATE на базу данных.

Разрешения для SQL Server 2022 и более поздних версий

Требуется разрешение VIEW SERVER PERFORMANCE 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);  

См. также

sys.dm_clr_loaded_assemblies (Transact-SQL)
Связанные динамические административные представления среды cl language (Transact-SQL)