sys.dm_clr_appdomains (Transact-SQL)

Renvoie une ligne pour chaque domaine d'application du serveur. Le domaine d'application (AppDomain) est une construction dans le langage CLR Microsoft .NET Framework (Common Language Runtime) qui représente l'unité d'isolement d'une application. Vous pouvez utiliser cette vue pour comprendre et résoudre les objets d'intégration CLR qui sont en cours d'exécution dans Microsoft SQL Server.

Il existe plusieurs types d'objets de base de données managés d'intégration CLR. Pour obtenir des informations générales sur ces objets, consultez Création d'objets de base de données avec l'intégration CLR (Common Language Runtime). Dès lors que ces objets sont exécutés, SQL Server crée un domaine d'application AppDomain dans lequel il peut charger et exécuter le code requis. Le niveau d'isolement pour un domaine d'application AppDomain est un domaine d'application AppDomain par base de données et par propriétaire. Autrement dit, tous les objets CLR détenus par un utilisateur sont toujours exécutés dans le même AppDomain par base de données (si un utilisateur inscrit des objets de base de données CLR dans des bases de données différentes, ces objets s'exécuteront dans différents domaines d'application). Le domaine d'application AppDomain n'est pas supprimé une fois que l'exécution du code est terminée. Il est mis en cache dans la mémoire pour les prochaines exécutions. Les performances en sont alors améliorées.

Pour plus d'informations, consultez Domaines d'application.

Nom de la colonne

Type de données

Description

appdomain_address

varbinary(8)

Adresse du domaine d'application AppDomain. Tous les objets de base de données managés appartenant à un utilisateur sont toujours chargés dans le même domaine d'application AppDomain. Vous pouvez utiliser cette colonne pour rechercher dans tous les assemblys en cours de chargement dans ce domaine d'application AppDomain dans sys.dm_clr_loaded_assemblies.

appdomain_id

int

ID du domaine d'application AppDomain. Chaque domaine d'application AppDomain a un ID unique.

appdomain_name

varchar(386)

Nom du domaine d'application AppDomain tel qu'il est assigné par SQL Server.

creation_time

datetime

Heure de création du domaine d'application AppDomain. Dans la mesure où les domaines d'application AppDomains sont mis en cache et réutilisés pour améliorer les performances, creation_time ne correspond pas nécessairement au moment où le code a été exécuté.

db_id

int

ID de la base de données dans laquelle le domaine d'application AppDomain a été créé. Le code stocké dans deux bases de données différentes ne peut pas partager un domaine d'application AppDomain.

user_id

int

ID de l'utilisateur dont les objets peuvent s'exécuter dans le domaine d'application AppDomain.

state

nvarchar(128)

Descripteur pour l'état actuel du domaine d'application AppDomain. Un domaine d'application AppDomain peut être dans différents états de sa création à sa suppression. Pour plus d'informations, consultez la section « Remarques » de cette rubrique.

strong_refcount

int

Nombre de références fortes au domaine d'application AppDomain. Cela reflète le nombre de traitements en cours d'exécution qui utilisent le domaine d'application AppDomain. Notez que l'exécution de cette vue entraîne la création d'un compteur de références fortes ; même si aucun code n'est en cours d'exécution, strong_refcount aura une valeur de 1.

weak_refcount

int

Nombre de références faibles au domaine d'application AppDomain. Cela indique le nombre d'objets contenus dans le domaine d'application AppDomain qui sont mis en cache. Lorsque vous exécutez un objet de base de données managé, SQL Server le met en cache dans le domaine d'application AppDomain pour le réutiliser par la suite. Les performances en sont alors améliorées.

cost

int

Coût du domaine d'application AppDomain. Plus le coût est élevé, plus il y a de chances que le domaine d'application AppDomain soit déchargé si la mémoire est insuffisante. En général, le coût dépend de la quantité de mémoire requise pour recréer le domaine d'application AppDomain.

value

int

Valeur du domaine d'application AppDomain. Plus la valeur est basse, plus il y a de chances que le domaine d'application AppDomain soit déchargé si la mémoire est insuffisante. En général, la valeur dépend du nombre de connexions ou de traitements qui utilisent le domaine d'application AppDomain.

total_processor_time_ms

bigint

Temps processeur total, en millisecondes, utilisé par tous les threads lors de l'exécution dans le domaine d'application actuel depuis le démarrage du processus. Ceci équivaut à System.AppDomain.MonitoringTotalProcessorTime.

total_allocated_memory_kb

bigint

Taille totale, en kilo-octets, de toutes les allocations mémoire faites par le domaine d'application depuis sa création, sans soustraction de la mémoire recueillie. Ceci équivaut à System.AppDomain.MonitoringTotalAllocatedMemorySize.

survived_memory_kb

bigint

Nombre de kilo-octets qui ont survécu à la dernière collection bloquante complète et connus pour être référencés par le domaine d'application actuel. Ceci équivaut à System.AppDomain.MonitoringSurvivedMemorySize.

Notes

Il existe une relation un-à-plusieurs entre dm_clr_appdomains.appdomain_address et dm_clr_loaded_assemblies.appdomain_address.

Les tableaux suivants listent les valeurs d'état possibles, en donnent une description et précisent le moment où elles interviennent dans le cycle de vie du domaine d'application AppDomain. Vous pouvez utiliser ces informations pour suivre le cycle de vie d'un domaine d'application AppDomain et repérer le chargement d'instances AppDomain suspectes ou répétitives, sans avoir à analyser le journal des événements Windows.

Initialisation du domaine d'application AppDomain

État

Description

E_APPDOMAIN_CREATING

Le domaine d'application AppDomain est en cours de création.

Utilisation du domaine d'application AppDomain

État

Description

E_APPDOMAIN_SHARED

Le domaine d'application AppDomain est prêt à être utilisé par plusieurs utilisateurs.

E_APPDOMAIN_SINGLEUSER

Le domaine d'application AppDomain est prêt à être utilisé dans les opérations DDL. Ceux-ci diffèrent d'E_APPDOMAIN_SHARED en ceci que les domaines d'application AppDomains partagés sont utilisés pour les exécutions d'intégration du CLR par opposition aux opérations DDL. Ces domaines d'application AppDomains sont isolés d'autres opérations simultanées.

E_APPDOMAIN_DOOMED

Le domaine d'application AppDomain est planifié pour être déchargé mais des threads y sont en cours d'exécution.

Suppression du domaine d'application AppDomain

État

Description

E_APPDOMAIN_UNLOADING

SQL Server a demandé que le CLR décharge le domaine d'application AppDomain, généralement parce que l'assembly qui contient les objets de base de données managés a été altéré ou supprimé.

E_APPDOMAIN_UNLOADED

Le CLR a déchargé le domaine d'application AppDomain. Il s'agit généralement du résultat d'une procédure de remontée des problèmes causée par ThreadAbort, OutOfMemory ou une exception non gérée dans le code utilisateur.

E_APPDOMAIN_ENQUEUE_DESTROY

Le domaine d'application AppDomain a été déchargé dans le CLR et voué à être détruit par SQL Server.

E_APPDOMAIN_DESTROY

Le domaine d'application AppDomain est en cours de destruction par SQL Server.

E_APPDOMAIN_ZOMBIE

Le domaine d'application AppDomain a été détruit par SQL Server ; toutefois, les références au domaine d'application AppDomain n'ont pas toutes été supprimées.

Autorisations

Nécessite l'autorisation VIEW SERVER STATE sur la base de données.

Exemples

L'exemple suivant montre comment afficher les détails d'un domaine d'application AppDomain pour un assembly donné :

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)

L'exemple suivant montre comment afficher tous les assemblys dans un domaine d'application AppDomain donné :

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)

Voir aussi

Référence

sys.dm_clr_loaded_assemblies (Transact-SQL)

Vues de gestion dynamique CLR (Common Language Runtime) (Transact-SQL)