sys.dm_clr_appdomains (Transact-SQL)
Restituisce una riga per ogni dominio dell'applicazione nel server. Il dominio dell'applicazione (AppDomain) è un costrutto nella funzionalità Common Language Runtime (CLR) di Microsoft .NET Framework che corrisponde all'unità di isolamento per un'applicazione. È possibile utilizzare questa vista per identificare gli oggetti dell'integrazione con CLR che sono in esecuzione in Microsoft SQL Server, nonché risolvere i problemi relativi a tali oggetti.
Esistono diversi tipi di oggetti di database gestito dell'integrazione con CLR. Per informazioni generali su tali oggetti, vedere Building Database Objects with Common Language Runtime (CLR) Integration (informazioni in lingua inglese). Ogni volta che questi oggetti vengono eseguiti, in SQL Server viene creato un AppDomain in cui viene caricato ed eseguito il codice necessario. Il livello di isolamento per un AppDomain corrisponde a un AppDomain per database per proprietario. Ovvero, tutti gli oggetti CLR di proprietà di un utente vengono eseguiti sempre nello stesso dominio AppDomain per ogni database (se un utente registra oggetti di database CLR in database diversi, gli oggetti di database CLR verranno eseguiti in domini dell'applicazione diversi). Al termine dell'esecuzione del codice, AppDomain non viene eliminato, ma viene memorizzato nella cache per le future esecuzioni. In questo modo le prestazioni risultano migliorate.
Per ulteriori informazioni, vedere Domini applicazione.
Si applica a: SQL Server (da SQL Server 2008 a versione corrente). |
Nome colonna |
Tipo di dati |
Descrizione |
---|---|---|
appdomain_address |
varbinary(8) |
Indirizzo del dominio AppDomain. Tutti gli oggetti di database gestito di proprietà di un utente vengono sempre caricati nello stesso AppDomain. È possibile utilizzare questa colonna per cercare tutti gli assembly attualmente caricati in questo AppDomain in sys.dm_clr_loaded_assemblies. |
appdomain_id |
int |
ID del dominio AppDomain. Ogni AppDomain dispone di un ID univoco. |
appdomain_name |
varchar(386) |
Nome dell'AppDomain assegnato da SQL Server. |
creation_time |
datetime |
Ora di creazione del dominio AppDomain. Poiché gli AppDomain vengono memorizzati nella cache e riutilizzati per migliorare le prestazioni, il valore di creation_time non rappresenta necessariamente l'ora in cui il codice è stato eseguito. |
db_id |
int |
ID del database in cui questo AppDomain è stato creato. I codici archiviati in due database diversi non possono condividere un unico AppDomain. |
user_id |
int |
ID dell'utente i cui oggetti possono essere eseguiti in questo AppDomain. |
stato |
nvarchar(128) |
Descrittore per lo stato corrente di AppDomain. Un AppDomain può trovarsi in stati diversi dalla creazione all'eliminazione. Per ulteriori informazioni, vedere la sezione Osservazioni di questo argomento. |
strong_refcount |
int |
Numero di riferimenti forti al dominio AppDomain. Questo valore riflette il numero di batch attualmente in esecuzione che utilizzano questo AppDomain. Si noti che l'esecuzione di questa vista consente di creare uno strong refcount. Anche se attualmente non è in esecuzione alcun codice, il valore di strong_refcount sarà 1. |
weak_refcount |
int |
Numero di riferimenti deboli al dominio AppDomain corrente. Tale valore indica il numero di oggetti di AppDomain memorizzati nella cache. In SQL Server quando si esegue un oggetto di database gestito, tale oggetto viene memorizzato nella cache all'interno di AppDomain per il riutilizzo futuro. In questo modo le prestazioni risultano migliorate. |
cost |
int |
Costo del dominio AppDomain. Più elevato è il costo più è probabile che questo AppDomain debba essere scaricato perché la quantità di memoria disponibile è insufficiente. Il costo dipende in genere dalla quantità di memoria necessaria per ricreare questo AppDomain. |
value |
int |
Valore del dominio AppDomain. Più basso è il valore più è probabile che questo AppDomain debba essere scaricato perché la quantità di memoria disponibile è insufficiente. Il valore dipende in genere dal numero di connessioni o batch che utilizzano AppDomain. |
total_processor_time_ms |
bigint |
Tempo totale del processore, in millisecondi, utilizzato da tutti i thread durante l'esecuzione nel dominio dell'applicazione corrente dall'avvio del processo. Equivale a System.AppDomain.MonitoringTotalProcessorTime. |
total_allocated_memory_kb |
bigint |
Dimensioni totali, in kilobyte, di tutte le allocazioni di memoria eseguite dal dominio dell'applicazione dalla sua creazione, senza sottrarre la memoria raccolta. Equivale a System.AppDomain.MonitoringTotalAllocatedMemorySize. |
survived_memory_kb |
bigint |
Numero di kilobyte rimanenti dall'ultima raccolta di blocco completa e a cui fa riferimento il dominio dell'applicazione corrente. Equivale a System.AppDomain.MonitoringSurvivedMemorySize. |
Osservazioni
Tra dm_clr_appdomains.appdomain_address e dm_clr_loaded_assemblies.appdomain_address esiste una relazione uno-a-molti.
Nelle tabelle seguenti vengono elencati i possibili valori di state e le loro descrizioni. Le tabelle contengono inoltre informazioni sul momento del ciclo di vita di AppDomain in cui tali valori si presentano. Queste informazioni risultano utili per seguire il ciclo di vita di un AppDomain, nonché per monitorare lo scaricamento di istanze di AppDomain sospette o ripetitive senza analizzare il registro eventi di Windows.
Inizializzazione di AppDomain
Stato |
Descrizione |
---|---|
E_APPDOMAIN_CREATING |
È in corso la creazione dell'AppDomain. |
Utilizzo di AppDomain
Stato |
Descrizione |
---|---|
E_APPDOMAIN_SHARED |
L'AppDomain di run-time è pronto per essere utilizzato da più utenti. |
E_APPDOMAIN_SINGLEUSER |
L' AppDomain è pronto per l'utilizzo nelle operazioni DDL. Queste ultime differiscono da E_APPDOMAIN_SHARED per il fatto che gli AppDomain condivisi vengono utilizzati per le esecuzioni di integrazione di CLR e non per operazioni DDL. Tali AppDomain sono isolati da altre operazioni simultanee. |
E_APPDOMAIN_DOOMED |
Lo scaricamento di AppDomain è pianificato ma sono ancora presenti thread attualmente in esecuzione in tale dominio. |
Eliminazione di AppDomain
Stato |
Descrizione |
---|---|
E_APPDOMAIN_UNLOADING |
SQL Server ha richiesto lo scaricamento di AppDomain da parte di CLR. In genere questa richiesta viene eseguita in seguito alla modifica o alla rimozione dell'assembly contenente gli oggetti di database gestito. |
E_APPDOMAIN_UNLOADED |
Il CLR ha scaricato l'AppDomain. Questo è in genere il risultato di una procedura di escalation dovuta a ThreadAbort, OutOfMemory o un'eccezione non gestita nel codice utente. |
E_APPDOMAIN_ENQUEUE_DESTROY |
L'AppDomain è stato scaricato in CLR e impostato per l'eliminazione da parte di SQL Server. |
E_APPDOMAIN_DESTROY |
L'AppDomain è in corso di eliminazione da parte di SQL Server. |
E_APPDOMAIN_ZOMBIE |
L'AppDomain è stato eliminato da SQL Server, ma non sono stati eliminati tutti i riferimenti all'AppDomain. |
Autorizzazioni
È richiesta l'autorizzazione VIEW SERVER STATE nel database.
Esempi
Nell'esempio seguente viene illustrato come visualizzare i dettagli relativi a un AppDomain per un determinato 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);
Nell'esempio seguente viene illustrato come visualizzare tutti gli assembly di un determinato 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);
Vedere anche
Riferimento
sys.dm_clr_loaded_assemblies (Transact-SQL)
Viste a gestione dinamica relative a CLR (Common Language Runtime) (Transact-SQL)