sys.dm_clr_appdomains (Transact-SQL)
Restituisce una riga per ogni dominio applicazione nel server. Il dominio 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 MicrosoftSQL Server, nonché risolvere i problemi relativi a tali oggetti.
Esistono diversi tipi di oggetti del database gestito dell'integrazione con CLR. Per informazioni generali su tali oggetti, vedere Generazione di oggetti di database con l'integrazione CLR (Common Language Runtime). 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. Ciò significa che tutti gli oggetti CLR di proprietà di un utente vengono sempre eseguiti nello stesso AppDomain. Al termine dell'esecuzione del codice, l'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.
Nome colonna |
Tipo di dati |
Descrizione |
---|---|---|
appdomain_address |
varbinary(8) |
Indirizzo del dominio AppDomain. Tutti gli oggetti di un 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. |
state |
nvarchar(128) |
Stato corrente del dominio AppDomain. 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 un 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 questo AppDomain. |
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 essere utilizzato da un singolo utente per l'esecuzione delle operazioni DDL. |
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 del 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)