sys.dm_clr_appdomains (Transact-SQL)

Gäller för:SQL Server

Returnerar en rad för varje applikationsdomän på servern. Applikationsdomänen (AppDomain) är en konstruktion i Microsoft .NET Framework common language runtime (CLR) som är isoleringsenheten för en applikation. Du kan använda denna vy för att förstå och felsöka CLR-integrationsobjekt som körs i Microsoft SQL Server.

Det finns flera typer av CLR-integrationsobjekt för hanterad databas. För allmän information om dessa objekt, se Building Database Objects with Common Language Runtime (CLR) Integration. När dessa objekt körs skapar SQL Server en AppDomain under vilken den kan ladda och köra den nödvändiga koden. Isoleringsnivån för en AppDomain är en AppDomain per databas per ägare. Det vill säga, alla CLR-objekt som ägs av en användare körs alltid i samma AppDomain per databas (om en användare registrerar CLR-databasobjekt i olika databaser kommer CLR-databasobjekten att köras i olika applikationsdomäner). En AppDomain förstörs inte efter att koden är klar med exekveringen. Istället cachelagras den i minnet för framtida körningar. Detta förbättrar prestandan.

För mer information, se Application Domains.

Kolumnnamn Datatyp Beskrivning
appdomain_address varbinary(8) Adress till AppDomain. Alla hanterade databasobjekt som ägs av en användare laddas alltid i samma AppDomain. Du kan använda denna kolumn för att slå upp alla assemblies som för närvarande laddas i denna AppDomain i sys.dm_clr_loaded_assemblies.
appdomain_id int ID för AppDomain. Varje AppDomain har ett unikt ID.
appdomain_name Varchar(386) Namnet på AppDomain som tilldelats av SQL Server.
creation_time datetime Tiden då AppDomain skapades. Eftersom AppDomains cachas och återanvänds för bättre prestanda är creation_time inte nödvändigtvis den tid då koden kördes.
db_id int ID för databasen där denna AppDomain skapades. Kod lagrad i två olika databaser kan inte dela en AppDomain.
user_id int ID för användaren vars objekt kan köras i denna AppDomain.
state nvarchar(128) En beskrivning av AppDomains aktuella tillstånd. En AppDomain kan befinna sig i olika tillstånd från skapande till borttagning. Se avsnittet om kommentarer i denna artikel för mer information.
strong_refcount int Många starka referenser till denna AppDomain. Detta speglar antalet batchar som för närvarande körs och använder denna AppDomain. Genomförandet av denna uppfattning kommer att skapa en stark omräkning; även om det inte är någon kod som för närvarande körs, kommer strong_refcount att ha värdet 1.
weak_refcount int Antal svaga referenser till denna AppDomain. Detta anger hur många objekt som finns i AppDomain som är cachade. När du kör ett hanterat databasobjekt cachar SQL Server det i AppDomain för framtida återanvändning. Detta förbättrar prestandan.
cost int Kostnaden för AppDomain. Ju högre kostnaden, desto mer sannolikt är det att denna AppDomain lastas av under minnestryck. Kostnaden beror vanligtvis på hur mycket minne som krävs för att återskapa denna AppDomain.
värde int Värdet av AppDomain. Ju lägre värde, desto mer sannolikt är det att denna AppDomain tas av under minnestryck. Värdet beror vanligtvis på hur många anslutningar eller batcher som använder denna AppDomain.
total_processor_time_ms bigint Total processortid, i millisekunder, använd av alla trådar under körning i den aktuella applikationsdomänen sedan processen startade. Detta motsvarar System.AppDomain.MonitoringTotalProcessorTime.
total_allocated_memory_kb bigint Total storlek, i kilobyte, av alla minnesallokeringar som har gjorts av applikationsdomänen sedan den skapades, utan att subtrahera det insamlade minnet. Detta motsvarar System.AppDomain.MonitoringTotalAllocatedMemorySize.
survived_memory_kb bigint Antal kilobyte som överlevde den senaste fulla, blockerande samlingen och som är kända för att refereras av den aktuella applikationsdomänen. Detta motsvarar System.AppDomain.MonitoringSurvivedMemorySize.

Anmärkningar

Det finns en en-till-många-relation mellan dm_clr_appdomains.appdomain_address och dm_clr_loaded_assemblies.appdomain_address.

Följande tabeller listar möjliga tillståndsvärden , deras beskrivningar och när de inträffar i AppDomains livscykel. Du kan använda denna information för att följa livscykeln för en AppDomain och för att hålla utkik efter misstänkta eller upprepande AppDomain-instanser som avlastas, utan att behöva analysera Windows händelselogg.

AppDomain-initiering

Tillstånd Beskrivning
E_APPDOMAIN_CREATING AppDomain håller på att skapas.

AppDomain-användning

Tillstånd Beskrivning
E_APPDOMAIN_SHARED Runtime-AppDomain är redo att användas av flera användare.
E_APPDOMAIN_SINGLEUSER AppDomain är redo att användas i DDL-operationer. Dessa skiljer sig från E_APPDOMAIN_SHARED genom att delade AppDomains används för CLR-integrationsexekveringar istället för DDL-operationer. Sådana AppDomains är isolerade från andra samtidiga operationer.
E_APPDOMAIN_DOOMED AppDomain är planerad att laddas ut, men det körs för närvarande trådar i den.

AppDomain Cleanup

Tillstånd Beskrivning
E_APPDOMAIN_UNLOADING SQL Server har begärt att CLR ska lasta ur AppDomain, vanligtvis eftersom assembleren som innehåller de hanterade databasobjekten har ändrats eller tagits bort.
E_APPDOMAIN_UNLOADED CLR har avlastat AppDomain. Detta är vanligtvis resultatet av en eskaleringsprocedur på grund av ThreadAbort, OutOfMemory eller ett ohanterat undantag i användarkoden.
E_APPDOMAIN_ENQUEUE_DESTROY AppDomain har avlastats i CLR och satts att förstöras av SQL Server.
E_APPDOMAIN_DESTROY AppDomain håller på att förstöras av SQL Server.
E_APPDOMAIN_ZOMBIE AppDomain har förstörts av SQL Server; dock har inte alla referenser till AppDomain rensats bort.

Permissions

Kräver VIEW SERVER STATE-behörighet i databasen.

Behörigheter för SQL Server 2022 och senare

Kräver VIEW SERVER PERFORMANCE STATE behörighet på servern.

Examples

Följande exempel visar hur man ser detaljerna i en AppDomain för en given assembly:

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);  

Följande exempel visar hur man ser alla assemblies i en given 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);