sql >> Databasteknik >  >> RDS >> PostgreSQL

Go sql - preparerat uttalande omfattning

Förberedda satser är så att du kan köra upprepade SQL-kommandon som till exempel bara kan skilja sig åt i parametervärden.

De är inte avsedda att leva "länge" eftersom en förberedd sats kan (de gör om den anropas från en transaktion) reservera en aktiv databasanslutning ("lång" betyder när de inte används; det är helt okej att upprepade gånger utföra en förberedd sats många gånger även om det tar lång tid). En anslutning är en dyr resurs och bör bara hållas kvar så länge som behövs. Bara genom att skapa ett gäng förberedda uttalanden och inte stänga dem, kan du få slut på aktiva/tillåtna anslutningar och sedan blockera vidare kommunikation till db-servern.

Använd en förberedd sats om du vill köra samma insert , update eller select uttalande med olika parametrar flera gånger i en (HTTP) begäran. Använd inte förberedda uttalanden för att överleva (HTTP)-förfrågningar.

I vissa drivrutinsimplementeringar och databasservrar kan förberedda satser också involvera resurser som allokerats på själva DB-servern (inte i Go-applikationen). Till exempel kan en förberedd sats vara förkompilerad på DB-servern och servern kan förbereda en frågeexekveringsplan, allokera vissa resurser som minne för den. Dessa kan vara permanent reserverade tills det förberedda uttalandet stängs.

Det finns en artikel (upplagd av Myles McDonnell i kommentarerna nedan) som går in på implementeringsdetaljerna för Förberedda uttalanden i Go. Den nämner att om förberedda uttalanden inte skapas från transaktioner släpper de anslutningen tillbaka till anslutningspoolen, men vid behov försöker de återanvända samma som de förbereddes på (för om db-servern hjälper / spelar också en aktiv roll i förberedd sats är den bunden till anslutningen på serversidan). Om inte, kommer de att förbereda sig på nytt dem på en ny anslutning (som orsakar oönskade prestandakostnader).

Sammantaget är det du beskriver en fungerande modell, och om du har ett lågt antal förberedda uttalanden som behövs/exekveras i många efterföljande förfrågningar kan de innebära kortare svarstider. Men det betyder också att de å andra sidan på lång sikt kan leda till att alla dina förberedda uttalanden kommer att förberedas på poolens alla anslutningar. Bestäm om detta är acceptabelt i ditt fall.

I allmänhet bör detta undvikas (och förberedda uttalanden avslutas före slutet av HTTP-förfrågan), men om du bara har ett fåtal av dem och du behöver dem i många efterföljande förfrågningar, kan du flytta dem utanför förfrågningsomfånget .




  1. Datum/tidsstämpel för att spela in när en post lades till i tabellen?

  2. Returnera alla icke-beräknade kolumner från en tabell i SQL Server

  3. Arbeta med Salesforce.com Data i SQL Server Reporting Services

  4. Hur testar man en Oracle Stored Procedure med RefCursor returtyp?