PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Wycieki pamięci na serwerze postgresql po aktualizacji do Rails 4

Nie wiem, co jest lepsze:odpowiedz na moje pytanie lub zaktualizuj je ... więc postanawiam odpowiedzieć. Daj mi znać, jeśli lepiej zaktualizować

W końcu dowiadujemy się o problemie. Od wersji 3.1 Railsy dodały gotowe instrukcje na proste żądanie, takie jak User.find(id). Wersja 4.0, dodała przygotowane zestawienia do żądań dotyczących skojarzeń (has_many, among_to, has_one). Na przykład następujący kod:

class User
  has_many :adresses
end
user.addresses

wygeneruj żądanie

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

Problem polega na tym, że Railsy dodają tylko przygotowane zmienne instrukcji dla kluczy obcych (tutaj user_id). Jeśli używasz niestandardowego żądania sql, takiego jak

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

nie doda zmiennej do przygotowanych instrukcji dla move_at. Generuje więc przygotowane zestawienia przy każdym wywołaniu żądania. Railsy obsługują przygotowane instrukcje z pulą o maksymalnym rozmiarze 1000.

Jednak przygotowane instrukcje postgresql nie są udostępniane przez połączenie, więc w ciągu jednej lub dwóch godzin każde połączenie ma 1000 przygotowanych instrukcji. Niektóre z nich są bardzo duże. Prowadzi to do bardzo dużego zużycia pamięci na serwerze postgreqsl.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. JPA 2:użycie wielu kolumn w kluczach obcych

  2. aktualizowanie istniejących rekordów o unikalną liczbę całkowitą

  3. Jak działa pg_sleep_until() w PostgreSQL

  4. Jak działa funkcja Scale() w PostgreSQL

  5. PL/pgSQL dla dynamicznych zapytań typu „wszystko w jednym”