Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
JDBC-illesztőprogram letöltése
Az adaptív pufferelés úgy lett kialakítva, hogy bármilyen nagy értékű adatot lekérjen a kiszolgálói kurzorok terhelése nélkül. Az alkalmazások használhatják az adaptív pufferelési funkciót az SQL Server minden olyan verziójával, amelyet az illesztőprogram támogat.
Amikor az SQL Server Microsoft JDBC-illesztőprogramja végrehajt egy lekérdezést, az illesztőprogram az összes eredményt lekéri a kiszolgálóról az alkalmazás memóriájába. Bár ez a megközelítés minimálisra csökkenti az SQL Server erőforrás-felhasználását, a JDBC-alkalmazásban outOfMemoryError-t tud dobni a nagyon nagy eredményeket eredményező lekérdezésekhez.
Annak érdekében, hogy az alkalmazások nagyon nagy eredményeket tudjanak kezelni, az SQL Serverhez készült Microsoft JDBC-illesztőprogram adaptív pufferelést biztosít. Adaptív pufferelés esetén az illesztő az sql serverről kéri le az utasításvégrehajtási eredményeket, mivel az alkalmazásnak szüksége van rájuk, nem pedig egyszerre. Az illesztőprogram az eredményeket is elveti, amint az alkalmazás már nem fér hozzá hozzájuk. Az alábbiakban néhány példát mutatunk be, ahol az adaptív pufferelés hasznos lehet:
A lekérdezés nagyon nagy eredményhalmazt hoz létre: Az alkalmazás végrehajthat egy SELECT utasítást, amely több sort állít elő, mint amennyit az alkalmazás tárolhat a memóriában. A korábbi kiadásokban az alkalmazásnak kiszolgálói kurzort kellett használnia az OutOfMemoryError elkerülése érdekében. Az adaptív pufferelés lehetővé teszi egy tetszőlegesen nagy eredményhalmaz csak előre írásvédett átadását anélkül, hogy kiszolgálói kurzort kellene igényelnie.
A lekérdezés nagyon nagySQLServerResultSetoszlopokat vagySQLServerCallableStatementOUT paraméterértékeket állít elő: Az alkalmazás egyetlen értéket (oszlopot vagy OUT paramétert) tud lekérni, amely túl nagy ahhoz, hogy teljesen elférjen az alkalmazás memóriájában. Az adaptív pufferelés lehetővé teszi, hogy az ügyfélalkalmazás lekérjen egy ilyen értéket streamként a getAsciiStream, a getBinaryStream vagy a getCharacterStream metódusok használatával. Az alkalmazás lekéri az értéket az SQL Serverből a streamből való olvasás során.
Megjegyzés:
Adaptív pufferelés esetén a JDBC-illesztő csak annyi adatot pufferel, amennyivel rendelkezik. Az illesztőprogram nem biztosít nyilvános módszert a puffer méretének szabályozására vagy korlátozására.
Adaptív pufferelés beállítása
A JDBC-illesztőprogram 2.0-s verziójától kezdve az illesztőprogram alapértelmezett viselkedése "adaptív". Más szóval az adaptív pufferelési viselkedés eléréséhez az alkalmazásnak nem kell explicit módon kérnie az adaptív viselkedést. Az 1.2-es verzióban azonban a pufferelési mód alapértelmezés szerint "megtelt", és az alkalmazásnak explicit módon kellett kérnie az adaptív pufferelési módot.
Az alkalmazások háromféleképpen kérhetik az utasítás végrehajtását, ha adaptív pufferelést használnak:
Az alkalmazás a responseBuffering kapcsolati tulajdonságot "adaptív" értékre állíthatja. A kapcsolat tulajdonságainak beállításáról további információt a Kapcsolat tulajdonságainak beállítása című témakörben talál.
Az alkalmazás az SQLServerDataSource objektum setResponseBuffering metódusával beállíthatja a válaszpufferelési módot az adott SQLServerDataSource objektumon keresztül létrehozott összes kapcsolathoz.
Az alkalmazás az SQLServerStatement osztály setResponseBuffering metódusával beállíthatja egy adott utasításobjektum válaszpufferelési módját.
A JDBC-illesztőprogram 1.2-es verziójának használatakor az alkalmazásnak egy SQLServerStatement osztályba kellett leadnia az utasításobjektumot a setResponseBuffering metódus használatához. A Nagy adatminta olvasása és a Nagy adatok olvasása tárolt eljárásokkal minta példakódok bemutatják ezt a régi használatot.
A JDBC-illesztő 2.0-s verziójával azonban az alkalmazások az isWrapperFor metódust és a unwrap metódust használhatják a szállítóspecifikus funkciók eléréséhez anélkül, hogy feltételezné a megvalósítási osztály hierarchiáját. Például a kód, lásd a Nagy adatminta frissítése című témakört.
Nagy adatok beolvasása adaptív puffereléssel
Ha egyszer nagy értékeket olvas be a get<Type>Stream metódusok használatával, és a ResultSet oszlopait és a CallableStatement OUT paramétereit az SQL Server által visszaadott sorrendben éri el, az adaptív pufferelés minimálisra csökkenti az alkalmazás memóriahasználatát az eredmények feldolgozásakor. Adaptív pufferelés használatakor:
Az < és az > osztályokban definiált getTypeStream metódusok alapértelmezés szerint egyszer olvasható streameket adnak vissza, bár a streamek visszaállíthatók, ha az alkalmazás megjelöli. Ha az alkalmazás a streamet szeretné
reset, először meg kell hívnia a streammarkmetódusát.Az < és az > osztályokban definiált típusstreammetódusok olyan streameket adnak vissza, amelyek a metódus meghívása
marknélkül mindig áthelyezhetők a stream kiindulási helyére.
Ha az alkalmazás adaptív pufferelést használ, a típusstreamelési<>metódusok által lekért értékek csak egyszer kérhetők le. Ha ugyanazon az objektumon próbál meghívni bármilyen get<Type> metódust ugyanazon az oszlopon vagy paraméteren, miután meghívta a get<Type>Stream metódust, a rendszer kivételt jelez a következő üzenettel: "Az adatokat elérték, és nem állnak rendelkezésre ehhez az oszlophoz vagy paraméterhez".
Megjegyzés:
A ResultSet.close() metódus meghívása a ResultSet feldolgozása közben megköveteli, hogy az SQL Server Microsoft JDBC-illesztőprogramja beolvassa és elvetje az összes fennmaradó csomagot. Ez jelentős időt vehet igénybe, ha a lekérdezés nagy adatkészletet ad vissza, különösen akkor, ha a hálózati kapcsolat lassú.
Az adaptív pufferelés használatának irányelvei
A fejlesztőknek az alábbi fontos irányelveket kell követniük az alkalmazás memóriahasználatának minimalizálása érdekében:
Kerülje a selectMethod=cursor kapcsolati sztring tulajdonság használatát, hogy az alkalmazás nagyon nagy eredményhalmazt dolgozhasson fel. Az adaptív pufferelési funkció lehetővé teszi, hogy az alkalmazások kiszolgálói kurzor használata nélkül dolgozzanak fel nagyon nagy, csak előre olvasható eredményhalmazokat. Vegye figyelembe, hogy a selectMethod=cursor beállításakor az adott kapcsolat által létrehozott összes csak előre irányú, csak olvasható eredményhalmaz érintett. Más szóval, ha az alkalmazás rutinszerűen dolgoz fel néhány sort tartalmazó rövid eredményhalmazokat, akkor a kiszolgálói kurzor létrehozása, olvasása és bezárása az egyes eredményhalmazokhoz több erőforrást fog használni az ügyféloldalon és a kiszolgálóoldalon is, mint az a helyzet, amikor a selectMethod nincs kurzorra állítva.
Nagy szöveges vagy bináris értékeket olvashat streamként a getAsciiStream, a getBinaryStream vagy a getCharacterStream metódusok használatával a getBlob vagy a getClob metódusok helyett. Az 1.2-es verziótól kezdődően az SQLServerCallableStatement osztály új get<Type>Stream metódusokat biztosít erre a célra.
Győződjön meg arról, hogy a potenciálisan nagy értékű oszlopok az utolsó helyen vannak a SELECT utasítás oszloplistájában, és hogy az<> típusstreammetódusaival a rendszer a kiválasztott sorrendben fér hozzá az oszlopokhoz.
Győződjön meg arról, hogy az SQLServerCallableStatement létrehozásához használt SQL-paraméterek listájában az utolsóként deklarált, potenciálisan nagy értékű OUT paraméterek vannak deklarálva. Emellett győződjön meg arról, hogy az < get<Type>Stream metódusait a deklarált sorrendben használják az OUT paraméterek eléréséhez.
Ne hajtsa végre egyszerre több utasítást ugyanazon a kapcsolaton. Ha egy másik utasítást hajt végre az előző utasítás eredményeinek feldolgozása előtt, a feldolgozatlan eredmények pufferelhetők az alkalmazás memóriájába.
Vannak olyan esetek, amikor a selectMethod=cursor helyett a responseBuffering=adaptive használata előnyösebb lenne, például:
Ha az alkalmazás csak előre olvasható és írásvédett eredményhalmazt dolgoz fel lassan, például az egyes sorok beolvasásakor a felhasználói bemenet után, akkor a selectMethod=cursor használata ahelyett, hogy a responseBuffering=adaptive-t alkalmazná, segíthet csökkenteni az SQL Server erőforrás-használatát.
Ha az alkalmazás két vagy több csak továbbító, írásvédett eredményhalmazt dolgoz fel egyidejűleg ugyanazon a kapcsolaton, a selectMethod=cursor használata a responseBuffering=adaptive helyett segíthet csökkenteni az illesztőprogram számára szükséges memóriát az eredményhalmazok feldolgozása során.
Mindkét esetben figyelembe kell vennie a kiszolgálói kurzorok létrehozásának, olvasásának és bezárásának többletterhelését.
Emellett az alábbi lista néhány javaslatot is tartalmaz a görgethető és csak előre beállítható eredményhalmazokhoz:
Görgethető eredményhalmazok esetén az illesztő mindig beolvassa a memóriába az SQLServerResultSet objektum getFetchSize metódusa által jelzett sorok számát, még akkor is, ha az adaptív pufferelés engedélyezve van. Ha a görgetés outOfMemoryError értéket okoz, csökkentheti a beolvasott sorok számát az SQLServerResultSet objektum setFetchSize metódusának meghívásával, hogy a beolvasási méretet kisebb számú sorra állítsa, akár 1 sorra is, ha szükséges. Ha ez nem akadályozza meg az OutOfMemoryError függvényt, ne foglalja bele a nagyon nagy oszlopokat a görgethető eredményhalmazba.
Előre csak frissíthető eredményhalmazok esetén az illesztő általában beolvassa a memóriába az SQLServerResultSet objektum getFetchSize metódusa által jelzett sorok számát, még akkor is, ha az adaptív pufferelés engedélyezve van a kapcsolaton. Ha az SQLServerResultSet objektum következő metódusának meghívása OutOfMemoryError értéket eredményez, csökkentheti a beolvasott sorok számát az SQLServerResultSet objektum setFetchSize metódusának meghívásával, hogy a beolvasási méretet kisebb számú sorra állítsa, akár 1 sorra is, ha szükséges. Arra is kényszerítheti az illesztőprogramot, hogy ne puffereljen sorokat, ha az utasítás végrehajtása előtt meghívja az SQLServerStatement objektum setResponseBuffering metódusát "adaptív" paraméterrel. Mivel az eredményhalmaz nem görgethető, ha az alkalmazás egy nagy oszlopértéket ér el a Beolvasás<Típus>stream metódusok egyikével, az illesztő azonnal elveti az értéket, amint az alkalmazás olvassa, ugyanúgy, mint a csak előrefelé olvasható eredményhalmazok esetében.
Lásd még
A JDBC-illesztő teljesítményének és megbízhatóságának javítása