Подготвените изрази са за да можете да изпълнявате повтарящи се SQL команди, които може да се различават само в стойностите на параметрите например.
Те не са предназначени да живеят „дълго“, тъй като подготвеният оператор може (те го правят, ако бъде извикан от транзакция) да резервира активна връзка с базата данни („дълго“ означава, когато не се използват; напълно добре е многократно да изпълнявате подготвен оператор много пъти, дори ако това ще отнеме много време). Връзката е скъп ресурс и трябва да бъде задържана само докато е необходимо. Просто като създадете куп подготвени изрази и не ги затворите, можете да останете без активни/разрешени връзки и след това да блокирате по-нататъшната комуникация към db сървъра.
Използвайте подготвен оператор, ако искате да изпълните същия insert
, update
или select
оператор с различни параметри няколко пъти в една (HTTP) заявка. Не използвайте подготвен отчет за надживяване на (HTTP) заявки.
В определени реализации на драйвери и подготвени отчети на сървъри на бази данни може също да включват ресурси, разпределени на самия DB сървър (не в приложението Go). Например подготвено изявление може да бъде предварително компилирано на DB сървъра и сървърът може да подготви план за изпълнение на заявка, да разпредели определени ресурси, като памет за него. Те могат да бъдат запазени за постоянно, докато подготвеното извлечение не бъде затворено.
Има статия (публикувана от Myles McDonnell в коментарите по-долу), която разглежда подробностите за внедряването на Подготвени отчети в Go. Споменава се, че ако подготвените отчети не са създадени от транзакции, те освобождават връзката обратно към пула за връзки, но когато е необходимо, те се опитват да използват повторно същата, на която са били подготвени (защото ако db сървърът помага / също играе активна роля в подготвения оператор, той е обвързан с връзката от страната на сървъра). Ако не, те ще преподготвят ги при нова връзка (причиняващо нежелано натоварване на производителността).
Като цяло, това, което описвате, е работещ модел и ако имате малък брой подготвени изрази, които са необходими/изпълнени в много следващи заявки, те могат да означават по-кратки времена за отговор. Но това също означава, че от друга страна в дългосрочен план, те могат да доведат до това, че всички ваши подготвени отчети ще бъдат подготвени за всички връзки на пула. Решете дали това е приемливо във вашия случай.
По принцип това трябва да се избягва (и подготвеният оператор да бъде затворен преди края на HTTP заявката), но ако имате само няколко от тях и имате нужда от тях в много заявки, следващи една след друга, можете да ги преместите извън обхвата на заявката .