Ik weet niet wat beter is:mijn vraag beantwoorden of bijwerken ... dus ik kies ervoor om te antwoorden. Laat het me weten als het beter is om te updaten
Eindelijk vinden we het probleem. Sinds versie 3.1 heeft Rails op eenvoudig verzoek voorbereide instructies toegevoegd, zoals User.find(id). Versie 4.0, voorbereide verklaringen toegevoegd aan verzoeken over associaties (has_many, behoort_to, has_one). Bijvoorbeeld de volgende code:
class User
has_many :adresses
end
user.addresses
verzoek genereren
SELECT "addresses".* FROM "addresses" WHERE "addresses"."user_id" = $1 [["user_id", 1]]
Het probleem is dat Rails alleen voorbereide instructievariabelen voor externe sleutels toevoegt (hier user_id). Als u een aangepast sql-verzoek gebruikt, zoals
user.addresses.where("moved_at < ?", Time.now - 3.month)
het zal geen variabele toevoegen aan de voorbereide instructies voor verplaatst_at. Dus het genereert een voorbereide verklaring elke keer dat het verzoek wordt aangeroepen. Rails verwerken voorbereide verklaringen met een pool van maximale grootte van 1000.
Postgresql-voorbereide instructies worden echter niet gedeeld tussen verbindingen, dus in één of twee uur heeft elke verbinding 1000 voorbereide instructies. Sommige zijn erg groot. Dit leidt tot een zeer hoog geheugenverbruik op de postgreqsl-server.