Freigeben über


sys.dm_clr_appdomains (Transact-SQL)

Gibt eine Zeile für jede Anwendungsdomäne auf dem Server zurück. Eine Anwendungsdomäne (AppDomain) ist ein Konstrukt in Microsoft.NET Framework-CLR (Common Language Runtime), das die Einheit der Isolation für eine Anwendung angibt. Mit dieser Sicht können Sie CLR-Integrationsobjekte, die in MicrosoftSQL Server ausgeführt werden, verstehen und behandeln.

Es stehen mehrere Typen von CLR-Integrationsobjekten für verwaltete Datenbanken zur Verfügung. Allgemeine Informationen zu diesen Objekten finden Sie unter Erstellen von Datenbankobjekten mit CLR-Integration (Common Language Runtime). Wenn diese Objekte ausgeführt werden, wird in SQL Server eine AppDomain erstellt, unter der der erforderliche Code geladen und ausgeführt werden kann. Die Isolationsstufe für eine AppDomain entspricht einer AppDomain pro Datenbank und Besitzer. Das heißt, dass alle CLR-Objekte, die sich im Besitz eines Benutzers befinden, stets in derselben AppDomain ausgeführt werden. Eine AppDomain wird nicht zerstört, nachdem die Ausführung des Codes abgeschlossen ist. Stattdessen wird sie für die zukünftige Ausführung im Arbeitsspeicher zwischengespeichert. Dadurch wird die Leistung verbessert.

Weitere Informationen finden Sie unter Anwendungsdomänen.

Spaltenname

Datentyp

Beschreibung

appdomain_address

varbinary(8)

Adresse von AppDomain. Alle verwalteten Datenbankobjekte, die sich im Besitz eines Benutzers befinden, werden stets in derselben AppDomain geladen. Mit dieser Spalte können Sie nach allen Assemblys suchen, die derzeit in dieser AppDomain in sys.dm_clr_loaded_assemblies geladen sind.

appdomain_id

int

ID von AppDomain. Jede AppDomain besitzt eine eindeutige ID.

appdomain_name

varchar(386)

Name der AppDomain, die von SQL Server zugewiesen wurde.

creation_time

datetime

Zeitpunkt, zu dem AppDomain erstellt wurde. Da AppDomains zwischengespeichert und zum Optimieren der Leistung wiederverwendet werden, entspricht creation_time nicht notwendigerweise dem Zeitpunkt, zu dem der Code ausgeführt wurde.

db_id

int

ID der Datenbank, in der diese AppDomain erstellt wurde. Für Code, der in zwei unterschiedlichen Datenbanken gespeichert wird, kann keine gemeinsame AppDomain verwendet werden.

user_id

int

ID des Benutzers, dessen Objekte in dieser AppDomain ausgeführt werden können.

state

nvarchar(128)

Aktueller Status von AppDomain. Weitere Informationen finden Sie im Abschnitt Hinweise in diesem Thema.

strong_refcount

int

Anzahl der starken Verweise auf AppDomain. Hiermit wird die Anzahl der derzeit ausgeführten Batches angegeben, für die diese AppDomain verwendet wird. Beachten Sie, dass durch Ausführen dieser Sicht ein strong refcount erstellt wird; selbst wenn derzeit kein Code ausgeführt wird, weist strong_refcount den Wert 1 auf.

weak_refcount

int

Anzahl der schwachen Verweise auf AppDomain. Hiermit wird angegeben, wie viele Objekte in der AppDomain zwischengespeichert werden. Wenn Sie ein verwaltetes Datenbankobjekt ausführen, wird es in SQL Server für die zukünftige Wiederverwendung in der AppDomain zwischengespeichert. Dadurch wird die Leistung verbessert.

cost

int

Kosten von AppDomain. Je höher die Kosten sind, desto wahrscheinlicher ist es, dass diese AppDomain mit ungenügendem Arbeitsspeicher entladen wird. Die Kosten hängen normalerweise davon ab, wie viel Arbeitsspeicher erforderlich ist, um diese AppDomain neu zu erstellen.

value

int

Wert von AppDomain. Je niedriger der Wert ist, desto wahrscheinlicher ist es, dass diese AppDomain mit ungenügendem Arbeitsspeicher entladen wird. Der Wert hängt gewöhnlich davon ab, für wie viele Verbindungen oder Batches diese AppDomain verwendet wird.

Hinweise

Zwischen dm_clr_appdomains.appdomain_address und dm_clr_loaded_assemblies.appdomain_address besteht eine 1:n-Beziehung.

In den folgenden Tabellen werden mögliche state-Werte aufgeführt, Beschreibungen der Werte und wann sie im AppDomain-Zyklus auftreten. Sie können diese Informationen verwenden, um dem Zyklus einer AppDomain zu folgen und auf Entladungen verdächtiger oder sich wiederholender AppDomain-Instanzen zu achten, ohne das Windows-Ereignisprotokoll analysieren zu müssen.

AppDomain-Initialisierung

Status

Beschreibung

E_APPDOMAIN_CREATING

Die AppDomain wird erstellt.

AppDomain-Verwendung

Status

Beschreibung

E_APPDOMAIN_SHARED

Die Laufzeit-AppDomain kann von mehreren Benutzern verwendet werden.

E_APPDOMAIN_SINGLEUSER

Die AppDomain kann von einem einzelnen Benutzer zum Ausführen von DDL-Vorgängen verwendet werden.

E_APPDOMAIN_DOOMED

Das Entladen der AppDomain wird geplant, es werden jedoch gegenwärtig Threads darin ausgeführt.

AppDomain-Cleanup

Status

Beschreibung

E_APPDOMAIN_UNLOADING

Von SQL Server wurde angefordert, dass die AppDomain von der CLR entladen wird. Normalerweise ist dies darauf zurückzuführen, dass die Assembly, die die verwalteten Datenbankobjekte enthält, geändert oder gelöscht wurde.

E_APPDOMAIN_UNLOADED

Die AppDomain wurde von der CLR entladen. Dies ist gewöhnlich das Ergebnis einer Ausweitungsprozedur aufgrund von ThreadAbort, OutOfMemory oder einer unbehandelten Ausnahme im Benutzercode.

E_APPDOMAIN_ENQUEUE_DESTROY

Die AppDomain wurde in CLR entladen und so festgelegt, dass sie von SQL Server zerstört wird.

E_APPDOMAIN_DESTROY

Die AppDomain wird gerade durch SQL Server zerstört.

E_APPDOMAIN_ZOMBIE

Die AppDomain wurde durch SQL Server zerstört; es wurden jedoch nicht alle Verweise auf die AppDomain gelöscht.

Berechtigungen

Erfordert die VIEW SERVER STATE-Berechtigung in der Datenbank.

Beispiele

Im folgenden Beispiel wird veranschaulicht, wie die Details einer AppDomain für eine bestimmte Assembly angezeigt werden können:

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)

Im folgenden Beispiel wird veranschaulicht, wie alle Assemblys in einer bestimmten AppDomain angezeigt werden können:

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)