A Connection-Pool tudatosságának fejlesztése ODBC-illesztőprogramban

Ez a témakör egy ODBC-illesztő fejlesztésének részleteit ismerteti, amely információkat tartalmaz arról, hogy az illesztőprogramnak hogyan kell biztosítania a kapcsolatkészletezési szolgáltatásokat.

Driver-Aware kapcsolatkészletezés engedélyezése

Az illesztőnek a következő ODBC szolgáltatói felületi (SPI) függvényeket kell implementálnia:

  • SQLSetConnectAttrForDbcInfo

  • SQLSetConnectInfo

  • SQLSetDriverConnectInfo

  • SQLGetPoolID

  • SQLRateConnection

  • SQLPoolConnect

  • SQLCleanupConnectionPoolID

További információkért tekintse meg az ODBC szolgáltatói felületének (SPI) referenciáját .

Az illesztőprogramnak a következő meglévő függvényeket is implementálnia kell, hogy az illesztőprogram-kompatibilis készletezés engedélyezhető legyen:

Funkció Hozzáadott funkciók
SQLAllocHandle

SQLFreeHandle

SQLGetDiagField

SQLGetDiagRec
Az új leírótípus támogatása: SQL_HANDLE_DBC_INFO_TOKEN (lásd az alábbi leírást).
SQLSetConnectAttr Az új csak beállított kapcsolatattribútum támogatása: SQL_ATTR_DBC_INFO_TOKEN a kapcsolat alaphelyzetbe állításához (lásd az alábbi leírást).

Megjegyzés:

Az olyan elavult függvények, mint az SQLError és az SQLSetConnectOption , nem támogatottak az illesztőprogram-tudatos kapcsolatkészletezéshez.

Pool azonosítója

A készletazonosító egy mutatóhosszú illesztőprogram-specifikus azonosító, amely a felcserélhető kapcsolatok egy adott csoportját jelöli. A kapcsolati információk halmaza alapján a meghajtónak gyorsan következtetnie kell a megfelelő pool ID-re.

A készletazonosítónak például kódolnia kell a kiszolgáló nevét és hitelesítő adatait. Az adatbázis nevére azonban nincs szükség, mert előfordulhat, hogy egy illesztő újra felhasználhatja a kapcsolatot, majd kevesebb idő alatt módosíthatja az adatbázist, mint új kapcsolatot létesíteni.

Az illesztőprogramnak meghatározott kulcsattribútumokat kell definiálnia, amelyek a pool azonosítóját alkotják. A kulcsattribútumok értéke kapcsolati attribútumokból, kapcsolati sztringből és DSN-ből származhat. Ha ütközések merülnek fel ezekben a forrásokban, a meglévő, illesztőprogram-specifikus megoldási szabályzatot kell használni a visszamenőleges kompatibilitás érdekében.

Az Illesztőprogram-kezelő egy másik készletet fog használni a különböző készletazonosítókhoz. Az ugyanabban a készletben lévő összes kapcsolat újrafelhasználható. Az Illesztőprogram-kezelő soha nem fog újrahasználni egy másik készletazonosítóval rendelkező kapcsolatot.

Ezért az illesztőprogramoknak egyedi készletazonosítót kell hozzárendelniük minden olyan kapcsolatcsoporthoz, amelynek a megadott kulcsattribútumaiban ugyanaz az érték szerepel. Ha egy illesztőprogram ugyanazt a készletazonosítót használja két, a kulcsattribútumokban különböző értékekkel rendelkező kapcsolathoz, az Illesztőprogram-kezelő továbbra is ugyanabba a készletbe helyezi őket (az Illesztőprogram-kezelő nem tud semmit az illesztőprogram-specifikus kulcsattribútumokról). Ez azt jelenti, hogy az illesztőprogramnak jelentenie kell az Illesztőprogram-kezelőnek, hogy egy másik kulcsattribútum-készlettel rendelkező kapcsolat nem használható újra az SQLRateConnection függvényben. Ez csökkentheti a teljesítményt, és ez nem ajánlott.

Az Illesztőprogram-kezelő akkor sem használja újra egy másik illesztőprogram-környezetből lefoglalt kapcsolatot, ha minden kapcsolati információ egyezik. Az Illesztőprogram-kezelő egy másik készletet fog használni a különböző környezetekhez, még akkor is, ha a kapcsolatok azonos készletazonosítóval rendelkeznek. Ezért a poolazonosító helyi az illesztőprogram környezetében.

Az illesztőprogramból a készletazonosító lekéréséhez használt függvény az SQLGetPoolID függvény.

A kapcsolat értékelése

Ahelyett, hogy új kapcsolatot hozna létre, jobb teljesítményt érhet el, ha egy csatlakozott kapcsolatban visszaállít néhány kapcsolati információt (például az adatbázist). Ezért előfordulhat, hogy nem szeretné, hogy az adatbázis neve szerepeljen a kulcsattribútumok készletében. Ellenkező esetben minden adatbázishoz külön készletet használhat, ami nem feltétlenül jó a közepes szintű alkalmazásokban, ahol az ügyfelek különböző kapcsolati sztringeket használnak.

Amikor olyan kapcsolatot használ újra, amely attribútumeltérésekkel rendelkezik, az új alkalmazáskérelem alapján alaphelyzetbe kell állítania a nem egyező attribútumokat, hogy a visszaadott kapcsolat azonos legyen az alkalmazáskérelmével (lásd az SQLSetConnectAttr függvény SQL_ATTR_DBC_INFO_TOKEN attribútumának ismertetését). Az attribútumok alaphelyzetbe állítása azonban csökkentheti a teljesítményt. Az adatbázis alaphelyzetbe állításához például hálózati hívásra van szükség a kiszolgálóhoz. Ezért használjon újra egy tökéletesen illeszkedő kapcsolatot, ha van ilyen.

Az illesztőprogram egyik minősítési függvénye kiértékelheti a meglévő kapcsolatot egy új kapcsolatkéréssel. Az illesztőprogram minősítési függvénye például a következőt határozhatja meg:

  • Ha a meglévő kapcsolat tökéletesen megfelel a kérésnek.

  • Ha csak néhány jelentéktelen eltérés van, például a kapcsolat időtúllépése, amelyekhez nem szükséges a kiszolgálóval való kommunikáció az alaphelyzetbe állításhoz.

  • Ha vannak olyan eltérő attribútumok, amelyek megkövetelik a kiszolgálóval való kommunikáció alaphelyzetbe állítását, de még mindig jobb teljesítményt eredményeznek, mint egy új kapcsolat létrehozása.

  • Ha az eltérés egy olyan attribútum esetében történt, amely nagyon időigényes az alaphelyzetbe állításhoz (az illesztőprogram fejlesztője megfontolhatja, hogy hozzáadja ezt az attribútumot a készletazonosító létrehozásához használt kulcsattribútumok készletéhez).

0 és 100 közötti pontszám lehetséges, ahol a 0 azt jelenti, hogy nem használják újra, a 100 pedig tökéletesen megfeleltethető. Az SQLRateConnection a kapcsolat minősítésének függvénye.

Új ODBC-leíró – SQL_HANDLE_DBC_INFO_TOKEN

Az illesztőprogram-tudatos kapcsolatkészletezés támogatásához az illesztőprogramnak kapcsolati adatokra van szüksége a készletazonosító kiszámításához. Az illesztőprogramnak kapcsolati adatokra is szüksége van az új kapcsolatkérések és a készletben lévő kapcsolatok összehasonlításához. Amikor a medencében egy kapcsolat sem használható fel újra, az illesztőnek egy új kapcsolatot kell létesítenie, ezért szüksége van kapcsolati információkra.

Mivel a kapcsolati információk több forrásból is származhatnak (kapcsolati sztring, kapcsolati attribútumok és DSN), előfordulhat, hogy az illesztőnek elemeznie kell a kapcsolati sztringet, és fel kell oldania az ütközést ezek között a források között a fenti függvényhívásokban.

Ezért bevezetünk egy új ODBC-leírót: SQL_HANDLE_DBC_INFO_TOKEN. A SQL_HANDLE_DBC_INFO_TOKEN esetén az illesztőprogramnak nem kell többször elemeznie a kapcsolati sztringet, és feloldania a kapcsolati adatok ütközéseit. Mivel ez egy illesztőprogram-specifikus adatstruktúra, az illesztőprogram tárolhat olyan adatokat, mint a kapcsolati adatok vagy a készlet azonosítója.

Ezt a fogópontot csak az Illesztőprogram-kezelő és az illesztőprogram közötti interfészként használja a rendszer. Egy alkalmazás nem tudja közvetlenül hozzárendelni ezt a leírót.

A leíró alapfogópontja SQL_HANDLE_ENV típusú, ami azt jelenti, hogy a meghajtó a kapcsolati információk feloldása során a HENV leíróból nyerheti ki a környezeti adatokat.

Amikor új kapcsolatkérést kap, az Illesztőprogram-kezelő kioszt egy SQL_HANDLE_DBC_INFO_TOKEN típusú leírót a kapcsolatadatok tárolásához, miután megerősíti, hogy az illesztőprogram támogatja a kapcsolatkészlet-tudatosságot. Ha a kezelő használatát befejezte (de mielőtt az SQLDriverConnect-ből vagy az SQLConnect-ből az SQL_STILL_EXECUTING-en kívül más visszatérési kódot ad vissza), az Illesztőprogram-kezelő felszabadítja a kezelőt. Ezért a leíró az SQLAllocHandle hívás után jön létre, és az SQLFreeHandle hívás után megsemmisül. Az Illesztőprogram-kezelő garantálja, hogy a leíró felszabadul a társított HENV felszabadítása előtt (amikor az SQLDriverConnect vagy az SQLConnect hibát ad vissza).

Az illesztőprogramnak módosítania kell a következő függvényeket, hogy elfogadja az új leírótípust SQL_HANDLE_DBC_INFO_TOKEN:

  1. SQLAllocHandle

  2. SQLFreeHandle

  3. SQLGetDiagField

  4. SQLGetDiagRec

Az illesztőprogram-kezelő garantálja, hogy több szál nem ugyanazt a SQL_HANDLE_DBC_INFO_TOKEN fogantyút használja egyszerre. Ezért a fogópont szinkronizálási modellje nagyon egyszerű lehet az illesztőprogramon belül. Az illesztőprogram-kezelő nem vesz fel környezeti zárolást a SQL_HANDLE_DBC_INFO_TOKEN kiosztása és felszabadítása előtt.

Az illesztőprogram-kezelő SQLAllocHandle és SQLFreeHandle nem fogadja el ezt az új leírótípust.

SQL_HANDLE_DBC_INFO_TOKEN bizalmas információkat, például hitelesítő adatokat tartalmazhatnak. Ezért az illesztőprogramnak biztonságosan törölnie kell a bizalmas adatokat tartalmazó memóriapuffert (a SecureZeroMemory használatával), mielőtt ezzel a SQLFreeHandle-lel felengedné a leírót. Amikor egy alkalmazás környezeti leírója bezárul, az összes társított kapcsolatkészlet bezárul.

Kapcsolódási készlet minősítő algoritmus az illesztőprogram-kezelőben

Ez a szakasz a Driver Manager-kapcsolatkészletezés minősítési algoritmusát ismerteti. Az illesztőprogram-fejlesztők ugyanazt az algoritmust implementálhatják a visszamenőleges kompatibilitás érdekében. Lehet, hogy ez az algoritmus nem a legjobb. Pontosítsa ezt az algoritmust a megvalósítás alapján (ellenkező esetben nincs ok a funkció implementálására).

Az Illesztőprogram-kezelő 0 és 100 közötti integrált értékelést ad vissza a készlet minden egyes kapcsolatához. A 0 azt jelenti, hogy a kapcsolat nem használható újra, és a 100 a tökéletes egyeztetést jelzi. Tegyük fel, hogy a kapcsolatkérés neve hRequest, a készletből származó meglévő kapcsolat pedig hCandidate néven van elnevezve. Ha az alábbi feltételek bármelyike hamis, a készletezett hCandidate kapcsolat nem használható újra a hRequesthez (az illesztőprogram-kezelő 0-s minősítést rendel hozzá).

  • A hCandidate és a hRequest egyaránt UNICODE API-ból (például SQLDriverConnectW) vagy ANSI API-ból (például SQLDriverConnectA) származik. (A UNICODE-illesztőprogramok eltérően viselkedhetnek az ANSI API és a UNICODE API miatt (lásd a SQL_ATTR_ANSI_APP kapcsolatattribútumot).)

  • A hCandidate és a hRequest függvényt ugyanaz a függvény hozza létre; VAGY SQLDriverConnect vagy SQLConnect.

  • A hCandidate megnyitásához használt kapcsolati sztringnek meg kell egyeznie a hRequest azonosítóval az SQLDriverConnect használatakor.

  • A hCandidate megnyitásához használt ServerName (vagy DSN), felhasználónév és jelszó megegyezik a hRequest megnyitásához az SQLConnect használatakor.

  • Az aktuális szál biztonsági azonosítójának (SID)-nek meg kell egyeznie a hCandidate megnyitásához használt BIZTONSÁGI azonosítóval.

  • Az olyan meghajtók esetében, amelyek költségesek a regisztráláshoz és törléshez (lásd az SQLConnect SQL_DTC_TRANSITION_COST ismertetését), a hRequest újbóli használatának nem szabad további regisztrálást vagy törlést igényelnie.

Az alábbi táblázat a különböző forgatókönyvek pontszám-hozzárendelését mutatja be.

A készletezett kapcsolat és a kérelem közötti kapcsolatattribútumok összehasonlítása Nincs feliratkozás/ leiratkozás További beléptetés/mellőzés szükséges
A katalógus (SQL_ATTR_CURRENT_CATALOG) eltérő 60 50
Egyes kapcsolati attribútumok eltérőek, de a katalógus ugyanaz 90 70
Minden kapcsolatattribútum tökéletesen megfeleltetve 100 80

Szekvenciadiagram

Ez a szekvenciadiagram a jelen témakörben ismertetett alapvető készletezési mechanizmust mutatja be. Csak az SQLDriverConnect használatát mutatja, de az SQLConnect-eset hasonló.

Sorozatdiagram

Állapotdiagram

Ez az állapotdiagram a jelen témakörben ismertetett kapcsolati információs jogkivonat-objektumot mutatja be. A diagramon csak az SQLDriverConnect látható, de az SQLConnect-eset hasonló. Mivel az illesztőprogram-kezelőnek bármikor kezelnie kell a hibákat, az illesztőprogram-kezelő bármilyen állapot esetén meghívhatja az SQLFreeHandle-t .

Állapotdiagram

Lásd még:

Driver-Aware kapcsolatkészlet-kezelés
ODBC szolgáltatói felület (SPI) referenciája