Condividi tramite


Gestione delle connessioni con pool di driver

Il pool di connessioni consente a un'applicazione di usare una connessione da un pool di connessioni che non devono essere ristabilite per ogni utilizzo. Dopo aver creato e inserito una connessione in un pool, un'applicazione può riutilizzare tale connessione senza eseguire il processo di connessione completo.

L'uso di una connessione in pool può comportare miglioramenti significativi delle prestazioni, perché le applicazioni possono risparmiare il sovraccarico necessario per stabilire una connessione. Ciò può essere particolarmente significativo per le applicazioni di livello intermedio che si connettono su una rete o per le applicazioni che si connettono e disconnettono ripetutamente, ad esempio le applicazioni Internet.

Oltre ai miglioramenti delle prestazioni, l'architettura del pool di connessioni consente l'uso di un ambiente e delle connessioni associate da più componenti in un unico processo. Ciò significa che i componenti autonomi nello stesso processo possono interagire tra loro senza essere consapevoli l'uno dell'altro. Una connessione in un pool di connessioni può essere usata ripetutamente da più componenti.

Annotazioni

Il pool di connessioni può essere usato da un'applicazione ODBC che presenta comportamento ODBC 2.x, purché l'applicazione possa chiamare SQLSetEnvAttr. Quando si usa il pool di connessioni, l'applicazione non deve eseguire istruzioni SQL che modificano il database o il contesto del database, ad esempio la modifica del <nome> del database, che modifica il catalogo utilizzato da un'origine dati.

Un driver ODBC deve essere completamente thread-safe e le connessioni non devono avere affinità di thread per supportare il pool di connessioni. Ciò significa che il driver è in grado di gestire una chiamata su qualsiasi thread in qualsiasi momento ed è in grado di connettersi su un thread, di usare la connessione su un altro thread e di disconnettersi su un terzo thread.

Il pool di connessioni viene gestito dal Gestore Driver. Le connessioni vengono disegnate dal pool quando l'applicazione chiama SQLConnect o SQLDriverConnect e vengono restituite al pool quando l'applicazione chiama SQLDisconnect. Le dimensioni del pool aumentano in modo dinamico, in base alle allocazioni di risorse richieste. Si riduce in base al timeout di inattività: se una connessione è inattiva per un periodo di tempo (non è stata usata in una connessione), viene rimossa dal pool. Le dimensioni del pool sono limitate solo dai vincoli di memoria e dai limiti del server.

Gestione driver determina se una connessione specifica in un pool deve essere usata in base agli argomenti passati in SQLConnect o SQLDriverConnect e in base agli attributi di connessione impostati dopo l'allocazione della connessione.

Quando il Gestore Driver gestisce il pool di connessioni, deve essere in grado di determinare se una connessione funziona ancora prima di rilasciarla. In caso contrario, il Gestore driver continua a fornire la connessione non funzionante all'applicazione ogni volta che si verifica un errore di rete temporaneo. Un nuovo attributo di connessione è stato definito in ODBC 3*.x*: SQL_ATTR_CONNECTION_DEAD. Si tratta di un attributo di connessione di sola lettura che restituisce SQL_CD_TRUE o SQL_CD_FALSE. Il valore SQL_CD_TRUE indica che la connessione è stata persa, mentre il valore SQL_CD_FALSE indica che la connessione è ancora attiva. I driver conformi alle versioni precedenti di ODBC possono supportare anche questo attributo.

Un driver deve implementare questa opzione in modo efficiente o compromettere le prestazioni del pool di connessioni. In particolare, una chiamata per ottenere questo attributo di connessione non deve causare un round trip verso il server. Al contrario, un driver deve restituire solo l'ultimo stato noto della connessione. La connessione è inattiva se l'ultima comunicazione col server non è riuscita e non è inattiva se l'ultima comunicazione è riuscita.

Osservazioni:

Se una connessione è stata persa (segnalata tramite SQL_ATTR_CONNECTION_DEAD), Gestione driver ODBC eliminerà tale connessione chiamando SQLDisconnect nel driver. Le nuove richieste di connessione potrebbero non trovare una connessione utilizzabile nel pool. Infine, il Gestore driver potrebbe stabilire una nuova connessione, assumendo che il pool sia vuoto.

Per usare un pool di connessioni, un'applicazione esegue la procedura seguente:

  1. Abilita il pool di connessioni chiamando SQLSetEnvAttr per impostare l'attributo di ambiente SQL_ATTR_CONNECTION_POOLING su SQL_CP_ONE_PER_DRIVER o SQL_CP_ONE_PER_HENV. Questa chiamata deve essere eseguita prima che l'applicazione allochi l'ambiente condiviso per il quale deve essere abilitato il pool di connessioni. L'handle di ambiente nella chiamata a SQLSetEnvAttr deve essere impostato su Null, che rende SQL_ATTR_CONNECTION_POOLING un attributo a livello di processo. Se l'attributo è impostato su SQL_CP_ONE_PER_DRIVER, per ogni driver è supportato un singolo pool di connessioni. Se un'applicazione funziona con molti driver e pochi ambienti, questo potrebbe risultare più efficiente perché potrebbe essere necessario un minor numero di confronti. Se impostato su SQL_CP_ONE_PER_HENV, per ogni ambiente è supportato un singolo pool di connessioni. Se un'applicazione funziona con molti ambienti e pochi driver, questo potrebbe essere più efficiente perché potrebbe essere necessario un minor numero di confronti. Il pool di connessioni è disabilitato impostando SQL_ATTR_CONNECTION_POOLING su SQL_CP_OFF.

  2. Alloca un ambiente chiamando SQLAllocHandle con l'argomento HandleType impostato su SQL_HANDLE_ENV. L'ambiente allocato da questa chiamata sarà un ambiente condiviso implicito perché il pool di connessioni è stato abilitato. L'ambiente da usare non viene tuttavia determinato finché non viene chiamato SQLAllocHandle con un HandleType di SQL_HANDLE_DBC in questo ambiente.

  3. Alloca una connessione chiamando SQLAllocHandle con InputHandle impostato su SQL_HANDLE_DBC e InputHandle impostato sull'handle di ambiente allocato per il pool di connessioni. Gestione driver tenta di trovare un ambiente esistente che corrisponda agli attributi dell'ambiente impostati dall'applicazione. Se tale ambiente non esiste, ne viene creato uno con un conteggio dei riferimenti (gestito dal Gestore driver) pari a 1. Se viene trovato un ambiente condiviso corrispondente, l'ambiente viene restituito all'applicazione e il relativo conteggio dei riferimenti viene incrementato. La connessione effettiva da usare non è determinata dal gestore dei driver fino a quando non viene chiamato SQLConnect o SQLDriverConnect.

  4. Chiama SQLConnect o SQLDriverConnect per stabilire la connessione. Gestione driver usa le opzioni di connessione nella chiamata a SQLConnect (o le parole chiave di connessione nella chiamata a SQLDriverConnect) e gli attributi di connessione impostati dopo l'allocazione della connessione per determinare quale connessione nel pool deve essere usata.

    Annotazioni

    La corrispondenza di una connessione richiesta a una connessione in pool è determinata dall'attributo dell'ambiente SQL_ATTR_CP_MATCH. Per altre informazioni, vedere SQLSetEnvAttr.

    Le applicazioni ODBC che usano il pool di connessioni devono chiamare CoInitializeEx durante l'inizializzazione dell'applicazione e CoUninitialize alla chiusura dell'applicazione.

  5. Chiama SQLDisconnect al termine della connessione. La connessione viene restituita al pool di connessioni e diventa disponibile per il riutilizzo.

Per una discussione approfondita, vedere Pooling nei componenti di Microsoft Data Access.

Considerazioni sul pool di connessioni

L'esecuzione di una delle azioni seguenti tramite un comando SQL (anziché tramite l'API ODBC) può influire sullo stato della connessione e causare problemi imprevisti quando il pool di connessioni è attivo:

  • Apertura di una connessione e modifica del database predefinito.

  • Utilizzo dell'istruzione SET per modificare tutte le opzioni configurabili(inclusi SET ROWCOUNT, ANSI_NULL, IMPLICIT_TRANSACTIONS, SHOWPLAN, STATISTICS, TEXTSIZE e DATEFORMAT).

  • Creazione di tabelle temporanee e procedure memorizzate.

Se una di queste azioni viene eseguita all'esterno dell'API ODBC, la persona successiva che usa la connessione erediterà automaticamente le impostazioni, le tabelle o le procedure precedenti.

Annotazioni

Non aspettarsi che alcune impostazioni siano presenti nello stato di connessione. È consigliabile impostare sempre lo stato della connessione nell'applicazione e assicurarsi che l'applicazione rimuova le impostazioni del pool di connessioni inutilizzate.

Driver-Aware Pool di Connessione

A partire da Windows 8, un driver ODBC può usare le connessioni nel pool in modo più efficiente. Per maggiori informazioni, vedere Pool di connessioni compatibile con il driver.

Vedere anche

Connessione a un'origine dati o a un driver
Sviluppo di un driver ODBC
Pooling nei componenti di Microsoft Data Access