Condividi tramite


Pool di connessioni di Gestione 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ò determinare miglioramenti significativi delle prestazioni, perché le applicazioni possono risparmiarsi 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 di usare un ambiente e le connessioni associate da parte di più componenti in un singolo 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 molteplici componenti.

Nota

Il pool delle connessioni può essere usato da un'applicazione ODBC che presenta un 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 usato da un'origine dati.

Un driver ODBC deve essere completamente thread-safe e le connessioni non devono avere affinità del 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 è conservato dal driver manager. Le connessioni derivano dal pool quando l'applicazione chiama SQLConnect o SQLDriverConnect e vengono riportate 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 sul server.

Il driver manager 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 driver manager esegue il pool delle connessioni, deve essere in grado di determinare se una connessione funziona ancora prima di consegnare la connessione. In caso contrario, il driver manager continua a consegnare la connessione inattiva 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 oppure ciò comprometterà le prestazioni del pool di connessioni. In particolare, una chiamata per ottenere questo attributo di connessione non deve provocare un round trip al server. Al contrario, un driver deve restituire solo l'ultimo stato noto della connessione. La connessione è inattiva se l'ultimo viaggio al server è fallito e non inattiva se l'ultimo viaggio è riuscito.

Osservazioni:

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

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

  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 dell'ambiente nella chiamata a SQLSetEnvAttr deve essere impostato su null, il 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 può essere più efficiente perché potrebbe essere necessario un minor numero di confronti. Se impostato su SQL_CP_ONE_PER_HENV, un singolo pool di connessioni è supportato per ogni ambiente. Se un'applicazione funziona con molti ambienti e pochi driver, questo può essere più efficiente perché potrebbe essere necessario un minor numero di confronti. Il pool di connessioni viene 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 fino a quando viene chiamato SQLAllocHandle con un handleType di SQL_HANDLE_DBC su 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. Il driver manager 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 di riferimento (conservato dal driver manager) pari a 1. Se viene trovato un ambiente condiviso corrispondente, l'ambiente viene riportato all'applicazione e il relativo conteggio di riferimento viene incrementato. (La connessione effettiva da usare non è determinata dal driver manager fino a quando SQLConnect o SQLDriverConnect viene chiamato.

  4. Chiama SQLConnect o SQLDriverConnect per stabilire la connessione. Il driver manager 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 la connessione che deve essere usata all’interno del pool.

    Nota

    La modalità con cui una connessione richiesta viene abbinata a una connessione in pool è determinata dall'attributo dell'ambiente SQL_ATTR_CP_MATCH. Per maggiori 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 riportata al pool di connessioni e diventa disponibile per il riutilizzo.

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

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 stored procedure.

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

Nota

Non aspettarsi la presenza di alcune impostazioni nello stato di connessione. È consigliabile impostare sempre lo stato di connessione nell'applicazione e garantire che l'applicazione rimuova le impostazioni del pool di connessioni inutilizzate.

Pool di connessioni compatibile con il driver

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.

Vedi anche

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