sql >> Database >  >> RDS >> PostgreSQL

Geheugenlekken op postgresql-server na upgrade naar Rails 4

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.




  1. Postgre SQL LIKE voor Integer

  2. Hoe u alle tabellen met identiteitskolom in SQL Server-database kunt vinden - SQL Server / T-SQL-zelfstudiedeel 45

  3. Oracle SQL De 5 laagste salarissen vinden

  4. Selecteer het eerste exemplaar van een record