コネクションプーリング無効化のためのGemを作った

このエントリを参考にしてRailsのコネクションプーリングを無効化するGemを作りました。

disable_connection_pooling

Disable the connection pooling of Rails. Connect to the database for each request.

なんだかデジャブが…

使い方

gem 'disable_connection_pooling'を追加して、config/application.rbで以下の設定を追加すればリクエストごとにコネクションが切断されるようになります。

module MyApp
  class Application.configure do
    ...
    config.active_record.disable_connection_pooling = true
  end
end

実装

参照先のエントリほぼそのままでRackのMiddlewareにフックを入れて、リクエスト終了時にコネクションをクリアしています。

また、Middlewareでは不要なQueryCacheを削除し、起動直後にもコネクションをクリアしています。 これにより、起動直後はデータベースに接続していない状態になります。

計測

EC2でコネクションプーリング有効なRailsアプリと、無効なRailsアプリの簡単なベンチマークを取りました。

スループットの限界までは見れていませんが、無効化したほうが若干レスポンスが遅い…かな。

サーバ構成

コネクションプーリング有効

f:id:winebarrel:20140215132508p:plain

コネクションプーリング無効

f:id:winebarrel:20140215132522p:plain