sys.dm_clr_appdomains (Transact-SQL)

Aplica-se a:SQL Server

Retorna uma linha para cada domínio de aplicativo no servidor. O domínio do aplicativo (AppDomain) é um constructo no CLR (Common Language Runtime) do Microsoft .NET Framework que é a unidade de isolamento de um aplicativo. Você pode usar essa exibição para entender e solucionar problemas de objetos de integração CLR que estão sendo executados no Microsoft SQL Server.

Há vários tipos de objetos de banco de dados gerenciados de integração CLR. Para obter informações gerais sobre esses objetos, consulte Criando objetos de banco de dados com integração do CLR (Common Language Runtime). Sempre que esses objetos são executados, SQL Server cria um AppDomain no qual ele pode carregar e executar o código necessário. O nível de isolamento de um AppDomain é um AppDomain por banco de dados por proprietário. Ou seja, todos os objetos CLR pertencentes a um usuário são sempre executados no mesmo AppDomain por banco de dados (se um usuário registrar objetos de banco de dados CLR em bancos de dados diferentes, os objetos de banco de dados CLR serão executados em domínios de aplicativo diferentes). Um AppDomain não é destruído depois que o código termina a execução. Em vez disso, ele é armazenado em cache na memória para execuções futuras. Isso melhora o desempenho.

Para obter mais informações, consulte Domínios de aplicativo.

Nome da coluna Tipo de dados Descrição
appdomain_address varbinary(8) Endereço do AppDomain. Todos os objetos de banco de dados gerenciados pertencentes a um usuário são sempre carregados no mesmo AppDomain. Você pode usar essa coluna para pesquisar todos os assemblies atualmente carregados neste AppDomain no sys.dm_clr_loaded_assemblies.
appdomain_id int ID do AppDomain. Cada AppDomain tem uma ID exclusiva.
appdomain_name varchar(386) Nome do AppDomain conforme atribuído por SQL Server.
creation_time datetime Hora em que o AppDomain foi criado. Como os AppDomains são armazenados em cache e reutilizados para melhor desempenho, creation_time não é necessariamente a hora em que o código foi executado.
db_id int ID do banco de dados no qual este AppDomain foi criado. O código armazenado em dois bancos de dados diferentes não pode compartilhar um AppDomain.
user_id int ID do usuário cujos objetos podem ser executados neste AppDomain.
state nvarchar(128) Um descritor para o estado atual do AppDomain. Um AppDomain pode estar em estados diferentes, da criação até a exclusão. Consulte a seção Comentários deste artigo para obter mais informações.
strong_refcount int Número de referências fortes a este AppDomain. Isso reflete o número de lotes em execução no momento que usam este AppDomain. A execução dessa exibição criará um refcount forte; mesmo que não seja um código em execução no momento, strong_refcount terá um valor de 1.
weak_refcount int Número de referências fracas para este AppDomain. Isso indica quantos objetos dentro do AppDomain são armazenados em cache. Quando você executa um objeto de banco de dados gerenciado, SQL Server o armazena em cache dentro do AppDomain para reutilização futura. Isso melhora o desempenho.
cost int Custo do AppDomain. Quanto maior o custo, maior a probabilidade de o AppDomain ser descarregado sob pressão de memória. O custo geralmente depende da quantidade de memória necessária para recriar esse AppDomain.
value int Valor do AppDomain. Quanto menor o valor, maior a probabilidade de o AppDomain ser descarregado sob pressão de memória. O valor geralmente depende de quantas conexões ou lotes estão usando este AppDomain.
total_processor_time_ms bigint Tempo total do processador, em milissegundos, usado por todos os threads em execução no domínio do aplicativo atual desde que o processo foi iniciado. Isso é equivalente a System.AppDomain.MonitoringTotalProcessorTime.
total_allocated_memory_kb bigint Tamanho total, em quilobytes, de todas as alocações de memória que foram feitas pelo domínio do aplicativo desde que foi criado, sem subtrair a memória coletada. Isso é equivalente a System.AppDomain.MonitoringTotalAllocatedMemorySize.
survived_memory_kb bigint Número de quilobytes que sobreviveram a última coleção de bloqueio completa e que são conhecidos por serem referenciados pelo domínio do aplicativo atual. Isso é equivalente a System.AppDomain.MonitoringSurvivedMemorySize.

Comentários

Há uma relação um-para-muitos entre dm_clr_appdomains.appdomain_address e dm_clr_loaded_assemblies.appdomain_address.

As tabelas a seguir listam valores de estado possíveis , suas descrições e quando ocorrem no ciclo de vida do AppDomain . Você pode usar essas informações para seguir o ciclo de vida de um AppDomain e observar o descarregamento de instâncias suspeitas ou repetitivas do AppDomain , sem precisar analisar o Log de Eventos do Windows.

Inicialização de AppDomain

Estado Descrição
E_APPDOMAIN_CREATING O AppDomain está sendo criado.

Uso de AppDomain

Estado Descrição
E_APPDOMAIN_SHARED O AppDomain de runtime está pronto para uso por vários usuários.
E_APPDOMAIN_SINGLEUSER O AppDomain está pronto para uso em operações DDL. Estes diferem de E_APPDOMAIN_SHARED porque os AppDomains compartilhados são usados para execuções de integração de CLR em vez de operações DDL. Esses AppDomains são isolados de outras operações simultâneas.
E_APPDOMAIN_DOOMED O AppDomain está programado para ser descarregado, mas atualmente há threads em execução nele.

Limpeza de AppDomain

Estado Descrição
E_APPDOMAIN_UNLOADING SQL Server solicitou que o CLR descarrega o AppDomain, geralmente porque o assembly que contém os objetos de banco de dados gerenciados foi alterado ou removido.
E_APPDOMAIN_UNLOADED O CLR descarregou o AppDomain. Isso geralmente é o resultado de um procedimento de escalonamento devido a ThreadAbort, OutOfMemory ou uma exceção sem tratamento no código do usuário.
E_APPDOMAIN_ENQUEUE_DESTROY O AppDomain foi descarregado em CLR e definido como destruído por SQL Server.
E_APPDOMAIN_DESTROY O AppDomain está no processo de ser destruído por SQL Server.
E_APPDOMAIN_ZOMBIE O AppDomain foi destruído por SQL Server; no entanto, nem todas as referências ao AppDomain foram limpas.

Permissões

Requer a permissão VIEW SERVER STAT no banco de dados.

Permissões para SQL Server 2022 e posteriores

Requer a permissão VIEW SERVER PERFORMANCE STATE no servidor.

Exemplos

O exemplo a seguir mostra como exibir os detalhes de um AppDomain para um determinado assembly:

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);  

O exemplo a seguir mostra como exibir todos os assemblies em um determinado AppDomain:

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);  

Consulte Também

sys.dm_clr_loaded_assemblies (Transact-SQL)
Exibições de gerenciamento dinâmico relacionadas ao Common Language Runtime (Transact-SQL)