Pooling di oggetti transazionali

I componenti transazionali che devono essere inseriti in pool hanno requisiti speciali.

Integrazione manuale delle risorse

Gli oggetti in pool che partecipano alle transazioni devono integrare manualmente le risorse gestite. Se un oggetto contiene risorse gestite tra i client, non sarà possibile che resource manager eselencherà automaticamente un'integrazione in una transazione quando l'oggetto viene attivato in un determinato contesto.

L'oggetto stesso deve gestire la logica di rilevamento della transazione, la disattivazione dell'integrazione automatica del gestore risorse e l'integrazione manuale di tutte le risorse contenute. I passaggi per eseguire questa operazione sono specifici del gestore risorse in uso. Se è necessario eseguire l'integrazione manuale, consultare la documentazione relativa a Resource Manager.

Come descritto di seguito, gli oggetti possono essere inseriti in pool con affinità di transazione mentre una transazione è attiva e possono essere attivate con affinità di transazione se viene chiamato da un client associato a tale transazione. Prima di integrare le risorse, è necessario verificare l'affinità di transazione. Se l'oggetto è stato prelevato dal pool specifico di tale transazione, è già stato eseguito il lavoro in tale transazione ed è stato inserito nell'elenco delle risorse.

Disattivazione dell'integrazione automatica

L'integrazione automatica deve essere disattivata dopo l'acquisizione della risorsa, in genere nel costruttore dell'oggetto. Ovvero, si disabilita l'integrazione automatica e quindi ci si connette.

La disabilitazione dell'integrazione automatica può talvolta essere una procedura sottile, in particolare nel caso di provider di accesso ai dati a più livelli. L'integrazione automatica viene talvolta associata al pool di connessioni, come con ODBC e talvolta non come con OLE DB. Potrebbe essere necessario assicurarsi che l'integrazione automatica sia disattivata a diversi livelli di provider.

Implementazione di IObjectControl

Gli oggetti poolable che partecipano alle transazioni devono monitorare lo stato corrente delle risorse che contengono. Se l'oggetto rileva che si trova in uno stato non riutilizzabile, ad esempio se una connessione non è valida, deve restituire False per IObjectControl::CanBePooled. Ciò avrà l'effetto di rimuovere l'istanza dell'oggetto e di indestrire la transazione corrente.

Pool specifici delle transazioni

Un pool di oggetti è in genere omogeneo e qualsiasi oggetto in pool non attualmente in uso è utile per tornare a qualsiasi client. L'unica eccezione a questa regola è nel caso di oggetti transazionali, per cui il pool di oggetti è ottimizzato. Quando il client che richiede un oggetto ha una transazione associata, COM+ analizzerà il pool per individuare un oggetto disponibile già associato a tale transazione. Se viene trovato un oggetto con affinità di transazione, viene restituito al client; in caso contrario, viene restituito un oggetto dal pool generale.

In questo modo, vengono mantenuti sottopool speciali contenenti oggetti con affinità per una determinata transazione. Quando il commit o l'interruzione della transazione, questi oggetti vengono restituiti al pool generale senza affinità di transazione, pronti per essere usati da qualsiasi client.

Per questo motivo, quando il componente integra manualmente le risorse gestite in una transazione, deve prima verificare se sono già incluse. In tal caso, non è necessario eseguire l'integrazione.

Stringhe del costruttore di oggetti COM+

Controllo della durata e dello stato degli oggetti

Funzionamento del pool di oggetti

Miglioramento delle prestazioni con il pool di oggetti

Requisiti per gli oggetti poolable