Ich weiß nicht, was besser ist:Beantworte meine Frage oder aktualisiere sie ... also entscheide ich mich für die Antwort. Bitte lassen Sie mich wissen, ob es besser ist, zu aktualisieren
Endlich finden wir das Problem heraus. Seit Version 3.1 hat Rails auf einfache Anfrage vorbereitete Anweisungen wie User.find(id) hinzugefügt. Version 4.0, hinzugefügte vorbereitete Anweisungen zu Anfragen nach Assoziationen (has_many, gehört_zu, has_one). Zum Beispiel folgender Code:
class User
has_many :adresses
end
user.addresses
Anfrage generieren
SELECT "addresses".* FROM "addresses" WHERE "addresses"."user_id" = $1 [["user_id", 1]]
Das Problem ist, dass Rails nur vorbereitete Statement-Variablen für Fremdschlüssel hinzufügt (hier user_id). Wenn Sie eine benutzerdefinierte SQL-Anfrage wie
verwendenuser.addresses.where("moved_at < ?", Time.now - 3.month)
es wird den vorbereiteten Anweisungen für moved_at keine Variable hinzugefügt. Es generiert also bei jedem Aufruf der Anfrage eine vorbereitete Anweisung. Rails verarbeitet vorbereitete Anweisungen mit einem Pool von maximal 1000.
Vorbereitete postgresql-Anweisungen werden jedoch nicht verbindungsübergreifend geteilt, sodass jede Verbindung in ein oder zwei Stunden 1000 vorbereitete Anweisungen hat. Einige von ihnen sind sehr groß. Dies führte zu einem sehr hohen Speicherverbrauch auf dem Postgreqsl-Server.