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 Microsoft SQL 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 pertenecen a un usuario se ejecutan siempre en el mismo Appdomain por base de datos (si un usuario registra objetos de base de datos de CLR en bases de datos diferentes, los objetos de base de datos de CLR se ejecutarán en dominios de aplicación diferentes). 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. |
estado |
nvarchar(128) |
Descriptor para el estado actual del AppDomain. Un AppDomain puede encontrarse en estados diferentes desde la creación a la eliminación. Vea la sección Comentarios 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. |
total_processor_time_ms |
bigint |
Tiempo total del procesador, en milisegundos, consumido por todos los subprocesos durante la ejecución en el dominio de aplicación actual desde que se inició el proceso. Es equivalente a System.AppDomain.MonitoringTotalProcessorTime. |
total_allocated_memory_kb |
bigint |
Tamaño total, en kilobytes, de todas las asignaciones de memoria realizadas por el dominio de aplicación desde que se creó, sin restar memoria recopilada. Es equivalente a System.AppDomain.MonitoringTotalAllocatedMemorySize. |
survived_memory_kb |
bigint |
Número de kilobytes que sobrevivieron a la última colección de bloqueo completa a que debe hacer referencia el dominio de aplicación actual. Es equivalente a System.AppDomain.MonitoringSurvivedMemorySize. |
Comentarios
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 su uso en operaciones de DDL. Se diferencian de E_APPDOMAIN_SHARED en que AppDomains compartidos se usan para ejecuciones de integración CLR en contraposición con operaciones de DDL. Dichos AppDomains están aislados de las operaciones simultáneas. |
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)
Vea también
Referencia
sys.dm_clr_loaded_assemblies (Transact-SQL)
Vistas de administración dinámica relacionadas con Common Language Runtime (Transact-SQL)