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

Hukommelseslækager på postgresql-serveren efter opgradering til Rails 4

Jeg ved ikke, hvad der er bedre:svar på mit spørgsmål eller opdater det ... så jeg vælger at svare. Fortæl mig venligst, hvis det er bedre at opdatere

Vi finder endelig ud af problemet. Siden version 3.1 har Rails tilføjet forberedte erklæringer på simpel anmodning som User.find(id). Version 4.0, tilføjede forberedte erklæringer til anmodninger om foreninger (har_mange, tilhører_til, har_en). For eksempel følgende kode:

class User
  has_many :adresses
end
user.addresses

generere anmodning

SELECT "addresses".* FROM "addresses" WHERE "addresses"."user_id" = $1  [["user_id", 1]]

Problemet er, at Rails kun tilføjer forberedte sætningsvariabler for fremmednøgler (her user_id). Hvis du bruger brugerdefineret sql-anmodning som

user.addresses.where("moved_at < ?", Time.now - 3.month) 

den vil ikke tilføje en variabel til de forberedte udsagn for moved_at. Så det genererer en forberedt erklæring hver gang anmodningen kaldes. Rails håndterer forberedte opgørelser med en pulje på max størrelse 1000.

Postgresql forberedte sætninger deles dog ikke på tværs af forbindelsen, så på en eller to timer har hver forbindelse 1000 forberedte sætninger. Nogle af dem er meget store. Dette førte til meget højt hukommelsesforbrug på postgreqsl-serveren.




  1. underforespørgsel i mysql tilfælde når klausul

  2. Skema kvalificerede tabeller med SQLAlchemy, SQLite og Postgresql?

  3. Indsættelse af form array-data i MySQL med PHP

  4. PHP MYSQL OPDATERING hvis Exist eller INSERT hvis ikke?