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)