sys.dm_clr_appdomains (Transact-SQL)
Devuelve una fila por cada dominio de aplicación en el servidor. El dominio de la aplicación (AppDomain) es una construcción en CLR (Common Language Runtime) de Microsoft.NET Framework que es la unidad de aislamiento de una aplicación. Puede utilizar esta vista para comprender y solucionar problemas relacionados con objetos de integración CLR que se ejecutan en MicrosoftSQL Server.
Existen varios tipos de objetos de base de datos administrados de integración CLR. Para obtener información general acerca de estos objetos, vea el tema sobre la creación de objetos de base de datos con la integración de Common Language Runtime (CLR). Siempre que se ejecuten estos objetos, SQL Server creará un AppDomain donde podrá cargarse y ejecutarse el código requerido. El nivel de aislamiento de un AppDomain es un AppDomain por base de datos por usuario. Es decir, todos los objetos CLR que sean propiedad de un usuario se ejecutarán siempre en el mismo AppDomain. Un AppDomain no se destruye después de que finalice la ejecución del código, sino que se almacena en la memoria caché de cara a futuras ejecuciones. De este modo se aumenta el rendimiento.
Para obtener más información, vea el artículo sobre dominios de aplicación.
Nombre de columna |
Tipo de datos |
Descripción |
---|---|---|
appdomain_address |
varbinary(8) |
Dirección de AppDomain. Todos los objetos de base de datos administrados que son propiedad de un usuario se cargan siempre en el mismo AppDomain. Puede utilizar esta columna para buscar todos los ensamblados actualmente cargados en este AppDomain en sys.dm_clr_loaded_assemblies. |
appdomain_id |
int |
Id. de AppDomain. Cada AppDomain tiene un Id. único. |
appdomain_name |
varchar(386) |
Nombre del AppDomain asignado por SQL Server. |
creation_time |
datetime |
Hora a la que se creó el AppDomain. Como los AppDomains se almacenan en caché y se reutilizan para obtener un mayor rendimiento, creation_time no tiene por qué ser necesariamente la hora a la que se ejecutó el código. |
db_id |
int |
Id. de la base de datos en la que se creó este AppDomain. El código almacenado en dos bases de datos distintas no puede compartir un mismo AppDomain. |
user_id |
int |
Id. del usuario cuyos objetos pueden ejecutarse en este AppDomain. |
state |
nvarchar(128) |
Estado actual del AppDomain. Vea la sección Notas de este tema para obtener más información. |
strong_refcount |
int |
Número de referencias seguras a este AppDomain. Esto refleja el número de lotes en ejecución que usan este AppDomain. Tenga en cuenta que la ejecución de esta vista creará un recuento de referencias seguro; aunque no haya código ejecutándose en estos momentos, strong_refcount tendrá el valor 1. |
weak_refcount |
int |
Número de referencias no seguras a este AppDomain. Esto indica cuántos objetos dentro del AppDomain se almacenan en caché. Al ejecutar un objeto de base de datos administrado, SQL Server lo almacena en caché dentro del AppDomain para reutilizarlo en un futuro. De este modo se aumenta el rendimiento. |
cost |
int |
Costo del AppDomain. Cuando mayor sea el costo, más probabilidades habrá de que este AppDomain se descargue bajo presión de la memoria. El costo suele depender de la cantidad de memoria requerida para volver a crear este AppDomain. |
value |
int |
Valor del AppDomain. Cuando menor sea el valor, más probabilidades habrá de que este AppDomain se descargue bajo presión de la memoria. El valor suele depender de la cantidad de conexiones o lotes que estén usando este AppDomain. |
Notas
Existe una relación de uno a varios entre dm_clr_appdomains.appdomain_address y dm_clr_loaded_assemblies.appdomain_address.
En la siguiente tabla se muestran los posibles valores de state, sus descripciones y cuándo se producen en el ciclo de vida del AppDomain. Puede utilizar esta información para seguir el ciclo de vida de un AppDomain y supervisar la descarga de instancias sospechosas o repetitivas de AppDomain sin tener que analizar el Registro de eventos de Windows.
Inicialización de AppDomain
Estado |
Descripción |
---|---|
E_APPDOMAIN_CREATING |
Se está creando el AppDomain. |
Uso de AppDomain
Estado |
Descripción |
---|---|
E_APPDOMAIN_SHARED |
El AppDomain de Common Language Runtime está listo para que lo utilicen varios usuarios. |
E_APPDOMAIN_SINGLEUSER |
El AppDomain está listo para que lo utilice un único usuario para realizar operaciones DDL. |
E_APPDOMAIN_DOOMED |
Se ha programado la descarga del AppDomain, pero en estos momentos hay subprocesos ejecutándose en el mismo. |
Limpieza de AppDomain
Estado |
Descripción |
---|---|
E_APPDOMAIN_UNLOADING |
SQL Server ha solicitado que CLR descargue el AppDomain, normalmente porque se ha modificado o eliminado el ensamblado que contiene los objetos de base de datos administrados. |
E_APPDOMAIN_UNLOADED |
CLR ha descargado el AppDomain. Esto suele ser el resultado de un procedimiento de concentración debido a ThreadAbort, OutOfMemory o a una excepción no controlada del código de usuario. |
E_APPDOMAIN_ENQUEUE_DESTROY |
El AppDomain se ha descargado en CLR y se ha establecido que SQL Server lo destruya. |
E_APPDOMAIN_DESTROY |
SQL Server está destruyendo el AppDomain. |
E_APPDOMAIN_ZOMBIE |
SQL Server ha destruido el AppDomain; sin embargo, no se han limpiado todas las referencias al AppDomain. |
Permisos
Requiere el permiso VIEW SERVER STATE en la base de datos.
Ejemplos
En los siguientes ejemplos se muestra la forma de ver los detalles de un AppDomain para un determinado ensamblado:
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)
En el siguiente ejemplo se muestra la forma de ver todos los ensamblados en un 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)