Delen via


Bekendheid met Connection-Pool ontwikkelen in een ODBC-stuurprogramma

In dit onderwerp worden de details besproken van het ontwikkelen van een ODBC-stuurprogramma dat informatie bevat over hoe het stuurprogramma services voor groepsgewijze verbindingen moet leveren.

Driver-Aware verbindingspooling inschakelen

Een stuurprogramma moet de volgende ODBC Service Provider Interface (SPI)-functies implementeren:

  • SQLSetConnectAttrForDbcInfo

  • SQLSetConnectInfo

  • SQLSetDriverConnectInfo

  • SQLGetPoolID

  • SQLRateConnection

  • SQLPoolConnect

  • SQLCleanupConnectionPoolID

Zie de naslaginformatie voor ODBC Service Provider Interface (SPI) voor meer informatie.

Een stuurprogramma moet ook de volgende bestaande functies implementeren, zodat stuurprogrammabewuste groepering kan worden ingeschakeld.

Functie Functionaliteit toegevoegd
SQLAllocHandle

SQLFreeHandle

SQLGetDiagField

SQLGetDiagRec
Ondersteuning voor het nieuwe handletype: SQL_HANDLE_DBC_INFO_TOKEN (zie de onderstaande beschrijving).
SQLSetConnectAttr Ondersteuning voor het nieuwe alleen-instelbare verbindingskenmerk: SQL_ATTR_DBC_INFO_TOKEN om de verbinding opnieuw in te stellen (zie de onderstaande beschrijving).

Opmerking

Afgeschafte functies, zoals SQLError en SQLSetConnectOption, worden niet ondersteund voor driver-bewuste verbinding pooling.

De pool-id

De pool-id is een aanwijzer-lengte stuurprogrammaspecifieke id om een bepaalde groep verbindingen te vertegenwoordigen die onderling uitwisselbaar zijn. Op basis van een set verbindingsgegevens moet een stuurprogramma snel de bijbehorende pool-id kunnen afleiden.

De pool-id moet bijvoorbeeld de servernaam en referentiegegevens coderen. De databasenaam is echter niet nodig omdat een stuurprogramma mogelijk een verbinding opnieuw kan gebruiken en vervolgens de database in minder tijd kan wijzigen dan het maken van een nieuwe verbinding.

Een stuurprogramma moet een set sleutelkenmerken definiëren, die bestaan uit de pool-id. De waarde van deze sleutelkenmerken kan afkomstig zijn van verbindingskenmerken, verbindingsreeks en DSN. Als er conflicten zijn in deze bronnen, moet het bestaande stuurprogrammaspecifieke oplossingsbeleid worden gebruikt voor compatibiliteit met eerdere versies.

Driver Manager gebruikt een andere pool voor verschillende pool-id's. Alle verbindingen in dezelfde pool kunnen opnieuw worden gebruikt. Driver Manager gebruikt nooit een verbinding met een andere pool-id.

Daarom moeten stuurprogramma's een unieke pool-id toewijzen voor elke groep verbindingen met dezelfde waarde in de gedefinieerde sleutelkenmerken. Als een stuurprogramma dezelfde pool-id gebruikt voor twee verbindingen met verschillende waarden in de sleutelkenmerken, plaatst Driver Manager deze nog steeds in dezelfde pool (driver manager weet niets over de kenmerken van de stuurprogrammaspecifieke sleutel). Dit betekent dat het stuurprogramma moet rapporteren aan Driver Manager dat een verbinding met een andere set sleutelkenmerken niet opnieuw kan worden gebruikt binnen de SQLRateConnection-functie. Dit kan de prestaties verminderen en dit wordt niet aanbevolen.

Driver Manager gebruikt geen verbinding die is toegewezen vanuit een andere stuurprogrammaomgeving, zelfs niet als alle verbindingsgegevens overeenkomen. Driver Manager gebruikt een andere groep voor verschillende omgevingen, zelfs wanneer verbindingen dezelfde pool-id hebben. Daarom is de pool-id lokaal voor de stuurprogrammaomgeving.

De functie voor het ophalen van de pool-id van het stuurprogramma is de SQLGetPoolID-functie.

De verbindingsclassificatie

Vergeleken met het tot stand brengen van een nieuwe verbinding, kunt u betere prestaties krijgen door bepaalde verbindingsgegevens (zoals DATABASE) opnieuw in te stellen in een gegroepeerde verbinding. U wilt dus mogelijk niet dat de databasenaam zich in uw set sleutelkenmerken bevindt. Anders kunt u voor elke database een afzonderlijke pool hebben, die mogelijk niet goed is in toepassingen in de middellaag, waarbij klanten verschillende verbindingsreeksen gebruiken.

Wanneer u een verbinding met een kenmerk dat niet overeenkomt, opnieuw gebruikt, moet u de niet-overeenkomende kenmerken opnieuw instellen op basis van de nieuwe toepassingsaanvraag, zodat de geretourneerde verbinding identiek is aan de toepassingsaanvraag (zie de bespreking van het kenmerk SQL_ATTR_DBC_INFO_TOKEN in de functie SQLSetConnectAttr). Het opnieuw instellen van deze kenmerken kan echter de prestaties verminderen. Voor het opnieuw instellen van een database is bijvoorbeeld een netwerkoproep naar de server vereist. Gebruik daarom een verbinding die perfect overeenkomt, als deze beschikbaar is.

Een beoordelingsfunctie in het stuurprogramma kan een bestaande verbinding met een nieuwe verbindingsaanvraag evalueren. De beoordelingsfunctie van het stuurprogramma kan bijvoorbeeld bepalen:

  • Als de bestaande verbinding perfect overeenkomt met de aanvraag.

  • Als er slechts enkele onbelangrijke verschillen zijn, zoals time-out voor de verbinding, waarvoor geen communicatie met de server nodig is om opnieuw in te stellen.

  • Als er een aantal niet-overeenkomende kenmerken zijn waarvoor een communicatie met de server nodig is om opnieuw in te stellen, maar toch betere prestaties oplevert dan het tot stand brengen van een nieuwe verbinding.

  • Als de mismatch zich voordoet voor een kenmerk dat erg tijdrovend is om te resetten, zou de ontwikkelaar van het stuurprogramma kunnen overwegen dit kenmerk toe te voegen aan de set van sleutelkenmerken om de pool-id te genereren.

Een score tussen 0 en 100 is mogelijk, waarbij 0 betekent dat ze niet opnieuw worden gebruikt en 100 perfect overeenkomen. SQLRateConnection is de functie voor het beoordelen van een verbinding.

Nieuwe ODBC-handle - SQL_HANDLE_DBC_INFO_TOKEN

Ter ondersteuning van stuurprogramma-bewuste verbinding pooling, heeft de driver verbindingsinformatie nodig om de Pool-ID te berekenen. Het stuurprogramma heeft ook verbindingsgegevens nodig om nieuwe verbindingsaanvragen te vergelijken met verbindingen in de groep. Wanneer er geen verbinding in de pool opnieuw kan worden gebruikt, moet het stuurprogramma een nieuwe verbinding tot stand brengen, waardoor verbindingsgegevens vereist zijn.

Omdat verbindingsgegevens afkomstig kunnen zijn van meerdere bronnen (verbindingsreeks, verbindingskenmerken en DSN), moet het stuurprogramma mogelijk de verbindingsreeks parseren en het conflict tussen deze bronnen in elk van de bovenstaande functieaanroep oplossen.

Daarom wordt er een nieuwe ODBC-ingang geïntroduceerd: SQL_HANDLE_DBC_INFO_TOKEN. Met SQL_HANDLE_DBC_INFO_TOKEN hoeft een stuurprogramma de verbindingsreeks niet meer dan één keer te parseren en conflicten in verbindingsgegevens op te lossen. Omdat dit een stuurprogrammaspecifieke gegevensstructuur is, kan het stuurprogramma gegevens opslaan, zoals verbindingsgegevens of pool-id.

Deze ingang wordt alleen gebruikt als een interface tussen Driver Manager en het stuurprogramma. Een toepassing kan deze ingang niet rechtstreeks toewijzen.

De bovenliggende ingang van deze ingang is van het type SQL_HANDLE_ENV, wat betekent dat het stuurprogramma de omgevingsgegevens van de HENV-ingang kan verkrijgen tijdens de oplossing van verbindingsgegevens.

Wanneer er een nieuwe verbindingsaanvraag wordt ontvangen, wijst de Driver Manager een handle van het type SQL_HANDLE_DBC_INFO_TOKEN toe voor het opslaan van verbindingsgegevens, nadat is bevestigd dat het stuurprogramma ondersteuning biedt voor verbindinggroepen. Wanneer u klaar bent met het gebruik van de handle (maar voordat u enkele retourcodes anders dan SQL_STILL_EXECUTING van SQLDriverConnect of SQLConnect retourneert), zal de Driver Manager de handle vrijmaken. Daarom wordt de handle gemaakt na de aanroep SQLAllocHandle en vernietigd na de SQLFreeHandle-aanroep. De Driver Manager garandeert dat de ingang wordt vrijgemaakt voordat de bijbehorende HENV wordt vrijgemaakt (wanneer SQLDriverConnect of SQLConnect een fout retourneert).

Het stuurprogramma moet de volgende functies wijzigen om het nieuwe ingangstype SQL_HANDLE_DBC_INFO_TOKEN te accepteren:

  1. SQLAllocHandle

  2. SQLFreeHandle

  3. SQLGetDiagField

  4. SQLGetDiagRec

Driver Manager garandeert dat meerdere threads niet tegelijkertijd dezelfde SQL_HANDLE_DBC_INFO_TOKEN ingang gebruiken. Daarom kan het synchronisatiemodel van deze handle heel eenvoudig zijn in de driver. Driver Manager neemt geen omgevingslock voordat SQL_HANDLE_DBC_INFO_TOKEN wordt toegewezen en vrijgemaakt.

SqlAllocHandle en SQLFreeHandle van Driver Manager accepteren dit nieuwe handletype niet.

SQL_HANDLE_DBC_INFO_TOKEN kan vertrouwelijke informatie bevatten, zoals referenties. Daarom moet een stuurprogramma de geheugenbuffer (met behulp van SecureZeroMemory) die de gevoelige informatie bevat, veilig wissen voordat deze ingang wordt vrijgegeven met SQLFreeHandle. Wanneer de omgevingsgreep van een toepassing wordt gesloten, worden alle bijbehorende verbindingsgroepen gesloten.

Beoordelingsalgoritmen voor stuurprogrammabeheer voor verbindingsgroepen

In deze sectie wordt het classificatie-algoritme voor groepsgewijze verbindingen van Driver Manager besproken. Ontwikkelaars van stuurprogramma's kunnen hetzelfde algoritme implementeren voor achterwaartse compatibiliteit. Dit algoritme is mogelijk niet het beste algoritme. U moet dit algoritme verfijnen op basis van uw implementatie (anders is er geen reden om deze functie te implementeren).

Driver Manager retourneert een integrale classificatie van 0 tot 100 voor elke verbinding van de pool. 0 betekent dat de verbinding niet opnieuw kan worden gebruikt en 100 geeft een perfecte overeenkomst aan. Stel dat de verbindingsaanvraag de naam hRequest heeft en dat de bestaande verbinding van de pool de naam hCandidate heeft. Als een van de volgende voorwaarden onwaar is, kan de gegroepeerde verbinding hCandidate niet opnieuw worden gebruikt voor hRequest (de Driver Manager wijst een classificatie van 0 toe).

  • hCandidate en hRequest zijn beide afkomstig van een UNICODE-API (zoals SQLDriverConnectW) of ANSI-API (zoals SQLDriverConnectA). (UNICODE-stuurprogramma's kunnen afwijken van de ANSI-API en UNICODE-API (zie het verbindingskenmerk SQL_ATTR_ANSI_APP).)

  • hCandidate en hRequest worden gemaakt met dezelfde functie; SQLDriverConnect of SQLConnect.

  • De verbindingsreeks die wordt gebruikt om hCandidate te openen, moet hetzelfde zijn als hRequest wanneer SQLDriverConnect wordt gebruikt.

  • De servernaam (of DSN), de gebruikersnaam en het wachtwoord die worden gebruikt om hCandidate te openen, moeten dezelfde zijn als voor het openen van hRequest wanneer SQLConnect wordt gebruikt.

  • De beveiligings-id (SID) van de huidige thread moet hetzelfde zijn als de SID die wordt gebruikt om hCandidate te openen.

  • Voor stuurprogramma's waarvoor aanmelding en afmelding duur is (zie de discussie over SQL_DTC_TRANSITION_COST in SQLConnect), mag het hergebruiken van hRequest geen extra aanmelding of afmelding vereisen.

In de volgende tabel ziet u de scoretoewijzing voor verschillende scenario's.

Vergelijking van verbindingskenmerken tussen de gegroepeerde verbinding en de aanvraag Geen inschrijving/uitschrijving Extra opname/uitlijsting vereisen
Catalogus (SQL_ATTR_CURRENT_CATALOG) verschilt 60 50
Sommige verbindingskenmerken verschillen, maar catalogus is hetzelfde 90 70
Alle verbindingskenmerken komen perfect overeen 100 80

Sequentiediagram

In dit sequentiediagram ziet u het basismechanisme voor pooling dat in dit onderwerp wordt beschreven. Er wordt alleen het gebruik van SQLDriverConnect weergegeven, maar de SQLConnect-case is vergelijkbaar.

Sequentiediagram

Statusdiagram

In dit statusdiagram ziet u het tokenobject voor verbindingsgegevens, zoals beschreven in dit onderwerp. In het diagram wordt alleen SQLDriverConnect weergegeven, maar de SQLConnect-case is vergelijkbaar. Omdat Driver Manager op elk gewenst moment fouten moet afhandelen, kan de Driver Manager SQLFreeHandle voor elke status aanroepen.

Statusdiagram

Zie ook

Driver-Aware verbindingsgroepering
Referentie voor ODBC Service Provider Interface (SPI)