Condividi tramite


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)