如何在ActiveRecord中重用连接?

时间:2016-04-18 15:01:30

标签: ruby activerecord sinatra

当我发现这个简单的API没有自动重用连接时,我正在玩Sinatra和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会在订阅者的前5次返回订阅者或404。我第六次超时了。在前5个GET中的每个GET之后,还有一个读取+写入文件描述符为newsletter.db打开。我希望一直只有一个。

如何告诉ActiveRecord重用连接?

1 个答案:

答案 0 :(得分: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在第二个线程而不是第一个线程中应用ConnectionManagement

修改

我解释了为什么使用中间件ActiveRecord::Connectionadapters::ConnectionManagement不能在线程模式下使用Thin,你可以找到here

2016.05.18编辑:

我使用精简作者跟进了此问题,此问题在问题307之后无法解决。