Nevím, co je lepší:odpovědět na mou otázku nebo ji aktualizovat ... tak se rozhodnu odpovědět. Dejte mi prosím vědět, zda je lepší aktualizovat
Konečně zjišťujeme problém. Od verze 3.1 přidával Rails připravené příkazy na jednoduchý požadavek jako User.find(id). Verze 4.0 přidala připravené příkazy k žádostem o přidružení (has_many, include_to, has_one). Například následující kód:
class User
has_many :adresses
end
user.addresses
vygenerovat požadavek
SELECT "addresses".* FROM "addresses" WHERE "addresses"."user_id" = $1 [["user_id", 1]]
Problém je v tom, že Rails přidává pouze připravené proměnné příkazu pro cizí klíče (zde user_id). Pokud používáte vlastní požadavek SQL, jako je
user.addresses.where("moved_at < ?", Time.now - 3.month)
nepřidá proměnnou do připravených příkazů pro move_at. Takže generuje připravené výpisy pokaždé, když je požadavek volán. Rails zpracovává připravené příkazy s fondem o maximální velikosti 1000.
Připravené příkazy postgresql však nejsou sdíleny napříč připojením, takže za jednu nebo dvě hodiny má každé připojení 1000 připravených příkazů. Některé z nich jsou velmi velké. To vedlo k velmi vysoké spotřebě paměti na postgreqsl serveru.