PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Speicherlecks auf dem Postgresql-Server nach dem Upgrade auf Rails 4

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

verwenden
user.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.