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 MicrosoftSQL 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) |
O estado atual do AppDomain. 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 por um único usuário para executar operações de DDL. |
E_APPDOMAIN_DOOMED |
O AppDomain está programado para ser descarregado, mas há encadeamentos 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)