sql >> データベース >  >> RDS >> PostgreSQL

Rails 4にアップグレードした後、postgresqlサーバーでメモリリークが発生する

    何が良いのかわかりません。質問に答えるか、更新してください...だから私は答えることを選びます。更新したほうがいいかどうか教えてください

    私たちはついに問題を見つけました。バージョン3.1以降、RailsはUser.find(id)のような単純なリクエストでプリペアドステートメントを追加しました。バージョン4.0、アソシエーション(has_many、belongs_to、has_one)のリクエストにプリペアドステートメントを追加しました。たとえば、次のコードの場合:

    class User
      has_many :adresses
    end
    user.addresses
    

    リクエストの生成

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

    問題は、Railsが外部キー(ここではuser_id)のプリペアドステートメント変数のみを追加することです。

    のようなカスタムSQLリクエストを使用する場合
    user.addresses.where("moved_at < ?", Time.now - 3.month) 
    

    moved_atのプリペアドステートメントに変数は追加されません。そのため、リクエストが呼び出されるたびにプリペアドステートメントが生成されます。 Railsは、最大サイズ1000のプールでプリペアドステートメントを処理します。

    ただし、postgresqlのプリペアドステートメントは接続間で共有されないため、1時間または2時間で、各接続に1000のプリペアドステートメントがあります。それらのいくつかは非常に大きいです。これにより、postgreqslサーバーで非常に高いメモリ消費が発生します。




    1. SHOW TABLESを使用してビューではなくテーブルのみを取得するにはどうすればよいですか?

    2. SQL Server(T-SQL)でデータベースメールプロファイルを削除する

    3. MySQLで列の値をシフトする方法は?

    4. DriverManager.getConnectionを使用すると、SQL接続がスタックするのはなぜですか?