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.