Partilhar via


sys.dm_clr_appdomains (Transact-SQL)

Retorna uma linha para cada domínio de aplicativo no servidor. O domínio do aplicativo (AppDomain) é uma construção na common language runtime (CLR)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 são executados em 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 a integração common language runtime (CLR). Sempre que esses objetos são executados, SQL Server cria um AppDomain sob o qual ele pode carregar e executar o código exigido. O nível de isolamento de um AppDomain é um AppDomain por banco de dados por proprietário. Ou seja, todos os objetos CLR de propriedade de um usuário são sempre executados no mesmo AppDomain. Um AppDomain não é destruído depois que a execução do código termina. Em vez disso, ele é colocado na memória para execuções futuras. Isto melhora o desempenho.

Para obter mais informações, consulte Application Domains.

Nome da coluna

Tipo de dados

Descrição

appdomain_address

varbinary(8)

Endereço do AppDomain. Todos os objetos de banco de dados gerenciados de propriedade de um usuário são sempre carregados no mesmo AppDomain. Você pode usar esta coluna para procurar todas as montagens atualmente carregadas neste AppDomain em sys.dm_clr_loaded_assemblies.

appdomain_id

int

A identificação do AppDomain. Cada AppDomain tem uma identificação exclusiva.

appdomain_name

varchar(386)

O nome do AppDomain como atribuído por SQL Server.

creation_time

datetime

Hora em que o AppDomain foi criado. Como AppDomains são colocados em cache e reusados para melhor desempenho, creation_time não é necessariamente a hora em que o código foi executado.

db_id

int

A identificação do banco de dados no qual esse AppDomain foi criado. O código armazenado em dois bancos de dados diferentes não pode compartilhar um AppDomain.

user_id

int

A identificação do usuário cujos objetos podem ser executados nesse AppDomain.

state

nvarchar(128)

Uma descrição do 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 tópico para obter mais informações.

strong_refcount

int

O número de referências fortes para este AppDomain. Isso reflete o número de lotes executados atualmente que usam esse AppDomain. Observe que a execução dessa exibição criará um strong refcount; mesmo se nenhum código estiver sendo executado atualmente, strong_refcount terá um valor de 1.

weak_refcount

int

O número de referências fracas para este AppDomain. Isso indica quantos objetos dentro do AppDomain são colocados em cache. Quando você executa um objeto de banco de dados gerenciado, SQL Server o coloca em cache dentro de AppDomain para reúso futuro. Isso melhora o desempenho.

cost

int

Custo de AppDomain. Quanto maior o custo, maior a probabilidade de que AppDomain seja descarregado sob pressão de memória. O custo normalmente depende de quanta memória é exigida para recriar esse AppDomain.

value

int

O valor do AppDomain. Quanto menor o custo, maior a probabilidade de que AppDomain seja descarregado sob pressão de memória. O valor normalmente depende de quantas conexões ou lotes estão usando esse AppDomain.

Comentários

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

As tabelas a seguir listam possíveis valores de estado, suas descrições e quando eles ocorrem no ciclo de vida de AppDomain. Você pode usar essas informações para seguir o ciclo de vida de um AppDomain e procurar instâncias suspeitas ou repetidas de AppDomain sendo descarregadas, sem análise no 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 tempo de execução 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 há threads sendo executados no momento.

Limpeza de AppDomain

Estado

Descrição

E_APPDOMAIN_UNLOADING

SQL Server solicitou que o CLR descarregue o AppDomain, normalmente porque a montagem que contém os objetos de banco de dados gerenciados foi alterada ou cancelada.

E_APPDOMAIN_UNLOADED

O CLR descarregou o AppDomain. Este normalmente é o resultado de um procedimento de escalonamento devido a ThreadAbort, OutOfMemory ou uma exceção não manipulada em código de usuário.

E_APPDOMAIN_ENQUEUE_DESTROY

O AppDomain foi descarregado em CLR e configurado para ser destruído por SQL Server.

E_APPDOMAIN_DESTROY

O AppDomain está no processo de destruição por SQL Server.

E_APPDOMAIN_ZOMBIE

O AppDomain foi destruído por SQL Server; porém, nem todas as referências ao AppDomain foram limpas.

Permissões

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

Exemplos

O exemplo a seguir mostra como exibir os detalhes de um AppDomain para uma determinada montagem.

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 todas as montagens 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)