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)