sql >> Database teknologi >  >> RDS >> PostgreSQL

Go sql - forberedt erklæringsomfang

Forberedte sætninger er således, at du kan udføre gentagne SQL-kommandoer, som f.eks. kun kan afvige i parameterværdier.

Det er ikke meningen, at de skal leve "langt", da en forberedt erklæring kan (de gør, hvis den kaldes fra en transaktion) reservere en aktiv databaseforbindelse ("lang" betyder, når de ikke bruges; det er helt fint at gentagne gange udføre en forberedt erklæring mange gange gange, selvom det tager lang tid). En forbindelse er en dyr ressource og bør kun holdes så længe som nødvendigt. Bare ved at oprette en masse forberedte erklæringer og ikke lukke dem, kan du løbe tør for aktive/tilladte forbindelser og derefter blokere for yderligere kommunikation til db-serveren.

Brug en forberedt sætning, hvis du ønsker at udføre den samme insert , update eller select sætning med forskellige parametre flere gange i én (HTTP) anmodning. Brug ikke forberedt erklæring til at overleve (HTTP) anmodninger.

I visse driverimplementeringer og databaseservere kan forberedte sætninger også involvere ressourcer allokeret på selve DB-serveren (ikke i Go-applikationen). For eksempel kan en forberedt sætning være prækompileret på DB-serveren, og serveren kan forberede forespørgselsudførelsesplan, allokere visse ressourcer, såsom hukommelse, til den. Disse kan være permanent reserveret, indtil den udarbejdede erklæring er lukket.

Der er en artikel (indsendt af Myles McDonnell i kommentarerne nedenfor), der går ind på implementeringsdetaljerne for Forberedte erklæringer i Go. Den nævner, at hvis der ikke oprettes udarbejdede opgørelser fra transaktioner, frigiver de forbindelsen tilbage til forbindelsespuljen, men når det er nødvendigt, forsøger de at genbruge det samme, som de blev udarbejdet på (fordi hvis db-serveren hjælper / også spiller en aktiv rolle i udarbejdet erklæring er den bundet til forbindelsen på serversiden). Hvis ikke, vil de genforberede sig dem på en ny forbindelse (forårsager uønsket ydeevneoverhead).

Alt i alt er det, du beskriver, en arbejdsmodel, og hvis du har et lavt antal udarbejdede udsagn, som er nødvendige/udført i mange efterfølgende forespørgsler, kan de betyde kortere svartider. Men det betyder også, at de på den anden side på den lange bane kan resultere i, at alle dine udarbejdede udsagn vil blive udarbejdet på alle puljens forbindelser. Beslut om dette er acceptabelt i dit tilfælde.

Generelt bør dette undgås (og forberedt erklæring lukkes inden udgangen af ​​HTTP-anmodningen), men hvis du kun har nogle få af dem, og du har brug for dem i mange forespørgsler, der følger hinanden, kan du flytte dem uden for anmodningens omfang .




  1. Jeg har brug for min PHP-side for at vise mit BLOB-billede fra mysql-databasen

  2. Sådan håndteres markørundtagelse, når udvælgelsesforespørgslen returnerer nul poster

  3. kør *.sql-fil med python MySQLdb

  4. Sådan får du den aktuelle dato i PostgreSQL