如何重用 ActiveRecord 中的连接?

How do I reuse connections in ActiveRecord?

当我发现连接不会被这个简单的 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 returns 订阅者或 404 前 5 次我获得了订阅者。第 6 次我超时。在前 5 个 GET 中的每一个之后,还有一个为 newsletter.db 打开的读+写文件描述符。我希望一直只有一个。

如何告诉 ActiveRecord 重用一个连接?

清除连接的一种方法是在每次使用 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 仅 returns 池中那些对当前线程有效的连接和 Thin 在第二个线程而不是第一个线程中应用 ConnectionManagement

编辑:

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

2016.05.18 编辑:

我跟瘦作者跟进了这个问题,这个问题在问题307之后没有得到解决。