Verbindingen Bundelen
Verbindingen bundelen (“connection pooling”) is een manier om het uitwisselen van data te verdelen over een bundel van verbindingen naar een database of clouddatabase. Het bundelen van verbindingen kan worden gebruikt om het aantal opbouw- en sluitbewerkingen op verbindingen te verminderen, wat tijd en middelen bespaart wanneer elke sessie niet telkens een specifieke verbinding met een database nodig heeft.
Een bundeling kan ook worden gebruikt wanneer een individuele sessie een specifieke verbinding volledig kan verzadigen om zo de belasting te verdelen over meerdere kanalen en de doorvoer naar de clouddatabase te verhogen. Wanneer elke verbinding een beperkte verwerkingscapaciteit per seconde, minuut of dag heeft, zal het samenvoegen van meerdere onafhankelijke verbindingen een hogere verwerkingscapaciteit opleveren dan een enkele verbinding, ervan uitgaande dat er geen andere beperkingen gelden voor schaarse bronnen zoals CPU-cycli, geheugencapaciteit, schijfdoorvoer of beperkte verwerkingscapaciteit van andere datacontainers.
Verbindingen bundelen over datacontainers heen
Op het niveau van de uitvoering van een SQL-statement gebruiken de select
, bulk insert
, insert
, update
, delete
en synchronize
statements automatisch een datacontainer gekozen uit een vaste lijst van datacontainers. Bij elke uitvoering van hetzelfde SQL-statement kan een andere datacontainer uit de lijst worden gekozen. Voor insert
, update
en delete
statements kan de datacontainer zelf variëren per rij die wordt uitgewisseld, terwijl de datacontainer ook kan variëren voor elke pagina rijen bij de uitvoering van bulk insert
.
De lijst van beschikbare datacontainers wordt opgegeven per tabelnaam. Voor een select
-statement kan elke instantie van een tabel die wordt gebruikt in het statement een andere lijst van datacontainers hebben, zoals bij de from
, join
en subqueries.
Als u bijvoorbeeld data toevoegt aan een tabel met een lijst van vier datacontainers, dan wordt de belasting verdeeld op een round-robin manier over de vier verbindingen van de datacontainers. De beginpositie wordt willekeurig gekozen voor het round-robin algoritme om ervoor te zorgen dat zelfs herhaalde uitvoering van een insert
statement met slechts één rij invoeging toch statistisch min of meer gelijkmatig wordt verdeeld over de beschikbare verbindingen.
Voorbeeld Gebundelde Cloudverbindingen
Het specificeren van extra datacontainers voor een bewerking is vrij eenvoudig. Vervang gewoon de datacontaineralias na @
door een door komma’s gescheiden lijst van de datacontainers om uit te kiezen, ingesloten in accolades, zoals:
declare
l_cnt number;
begin
for i in 1..10
loop
select count(*)
into l_cnt
from ExactOnlineREST..Journals@{eol1,eol2,eol3,eol4,eol5}
;
end loop;
end;
Bij elke uitvoering van het statement wordt een andere datacontainer gekozen om de telling via count
op uit te voeren. Na afloop van de uitvoering heeft elk van de vijf datacontainers het count
statement twee keer uitgevoerd.
Niet-pro rato verdeling
De datacontainer wordt gekozen op een “round-robin” manier. Als elke datacontainer één keer voorkomt, wordt de lading pro rato verdeeld. Het is echter toegestaan om dezelfde datacontainer meerdere keren op te nemen. Dit maakt een afwijkende verdeling van de belasting mogelijk, bijvoorbeeld als één gegevensverbinding een aanzienlijk hogere verwerkingscapaciteit heeft, zoals een hogere API-aanroepsnelheid of werkt via een snellere tussennode.
Het volgende insert
-statement zal bijvoorbeeld één van de drie insert-acties uitvoeren op de datacontainer eol1
, terwijl de datacontainer eol2
er twee uitvoert:
insert into ExactOnlineREST..Tasks@{eol1,eol2,eol2}
( description
)
values
( 'sample'
)
Verschillen tussen gegevenscontainers in pools
By design zijn er geen controles op de datacontainers die in een pool zijn opgenomen om ervoor te zorgen dat het gedrag consistent is. Het is bijvoorbeeld mogelijk om datacontainers te mixen die op een andere Invantive SQL-driver draaien, zoals:
@{eol1,eol2,oracle3,oracle4}
Een SQL-developer moet ervoor zorgen dat de acties het gewenste resultaat hebben, onafhankelijk van welke datacontainer wordt gekozen. Dit maakt het mogelijk om de belasting te verdelen over verschillende stuurprogramma’s en/of fysieke netwerkverbindingen, zoals een directe en een gebrugde netwerkverbinding.
Er is ook geen controle op geselecteerde partities. Elke datacontainer kan een andere lijst met beschikbare en geselecteerde partities hebben.
Snelheidswinst
Ervan uitgaande dat de gegevens die over de gebundelde verbindingen worden uitgewisseld direct beschikbaar zijn en er geen beperkingen zijn voor lokale bronnen, kan de prestatiewinst lineair zijn, afhankelijk van de beperkingen van het doelplatform. Zo zal het laden van gegevens in een cloudplatform met een verwerkingscapaciteit van 1 rij per seconde per verbinding, maar een geaggregeerde maximale verwerkingscapaciteit van 2.000 rijen per seconde bij gebruik van vier verbindingen, de loopduur typisch met een factor 4 verminderen.
Weggevallen verbindingen in een bundel
Bundeling voor cloudapplicaties vereist dat alle verbindingen stabiel zijn. Er zijn momenteel geen functies om verbindingen waarvan bekend is dat ze niet goed functioneren automatisch over te slaan. Hiervoor kan het fail-over mechanisme van Invantive databases gebruikt worden. In een toekomstige release kunnen verbindingen waarvan bekend is dat ze instabiel zijn worden uitgesloten van het ontvangen van actieverzoeken zolang ze instabiel zijn.
ANSI SQL en Bundeling van Verbindingen
Op alle SQL-gebaseerde verbindingen zoals PostgreSQL en Oracle RDBMS biedt Invantive SQL verbindingsbundeling aan sinds de introductie van de SQL engine. In settings*.xml
kan bundeling specifiek worden uitgeschakeld door AllowConnectionPooling
in te stellen op een datacontainer. Via de ConnectionString
kan bundeling voor SQL-gebaseerde verbindingen verder worden geconfigureerd met attributen zoals maximum-number-of-pooled-connections
.
Sommige afzonderlijke op SQL gebaseerde stuurprogramma’s bieden bovendien bundeling in de ADO.NET-laag. Deze kunnen worden geconfigureerd via de ConnectionString
. Invantive SQL stuurt alle verbindingsattributen die niet worden herkend voor gebruik met de Invantive driver automatisch door naar de ADO.NET driverlaag.
Beschikbaarheid
Gebundelde verbindingen voor cloudapplicaties zijn beschikbaar vanaf release 22.0.513 op alle Invantive producten.