2016-04-18 11 views
5

SinatraとActiveRecordでこの単純なAPIによって接続が自動的に再利用されていないことが判明したとき、私はこれを試していました。ActiveRecordで接続を再利用するにはどうすればよいですか?

#!/usr/bin/env ruby                     

require 'sinatra' 
require 'active_record' 

ActiveRecord::Base.establish_connection(
adapter: 'sqlite3', 
database: 'newsletter.db' 
) 

ActiveRecord::Schema.define do 
    create_table :subscribers do |t| 
    t.string :email 
    t.timestamps 
    end 
end 

class Subscriber < ActiveRecord::Base 
    validates :email, presence: true 
end 

class Newsletter < Sinatra::Base 

    set :server, :thin 

    get '/subscribers/:email' do 
    s = Subscriber.find_by_email(params[:email]) 
    if s == nil 
     status 404 
    else 
     content_type 'application/json' 
     s.to_json 
    end 
    end 

    post '/subscribers/:email' do 
    Subscriber.create(email: params[:email]) 
    end 

end 

Newsletter.run! 

APIは、加入者または404 Iは、加入者のGET最初の5回のいずれかを返します。 6回目はタイムアウトになります。最初の5つのGETのそれぞれの後に、newsletter.dbのために開いているもう1つの読み取り+書き込みファイル記述子があります。私はいつも1つしかないと思っています。

ActiveRecordに接続を再利用するように指示する方法を教えてください。

+1

この回答を見るhttp://stackoverflow.com/questions/10191531/activerecord-connection-warning-database-connections-will-not-be-closed-automa?rq=1 –

+0

その回答を見ると、私は 'ActiveRecord :: Base.clear_active_connections! 'という呼出しが私のために働くことに気付きました。 'ActiveRecord :: Base.connection.close'を試してみたところ、接続プールに接続を返すのではなく、接続を閉じたことがわかりました。私は 'config.ru'アプローチを試しませんでした。 – mrrusof

答えて

1

接続をクリーニングする1つの方法は、Subscriber.find_by_emailSubscriber.createを毎回使用した後にActiveRecord::Base.clear_active_connections!を呼び出すことです。

after do 
    ActiveRecord::Base.clear_active_connections! 
end 

Somewhere else、一部の人々は、ミドルウェアActiveRecord::ConnectionAdapters::ConnectionManagementを使用することをお勧め。 Thinはスレッド内の各要求の処理を開始し、別のスレッドで要求の処理を終了するため、Thinでは動作しません。 ConnectionManagementは、現在のスレッドでアクティブな接続のみをプールに戻し、Thinは最初のスレッドではなく2番目のスレッドでConnectionManagementを適用します。

EDIT:

は、私はあなたがhereを見つけることができますスレッドモードでシンでは動作しませんミドルウェアActiveRecord::Connectionadapters::ConnectionManagementを使用して理由の説明をしました。

2016年5月18日EDIT:

私はシンの著者で、この問題を追跡し、この問題は、問題307後に解決されません。

関連する問題