如何在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会在订阅者的前5次返回订阅者或404。 我第六次超时了。 在前5个GET中的每个GET之后,还有一个读取/写入文件描述符为newsletter.db打开。 我希望一直只有一个。

如何告诉ActiveRecord重用连接?

清除连接的一种方法是调用ActiveRecord::Base.clear_active_connections! 每次使用Subscriber.find_by_emailSubscriber.create ,就像这样。

 after do ActiveRecord::Base.clear_active_connections! end 

在其他地方 ,有些人建议使用中间件ActiveRecord::ConnectionAdapters::ConnectionManagement 。 这在Thin中不起作用,因为Thin开始处理线程中的每个请求并完成在另一个线程中处理请求。 ConnectionManagement仅向池返回那些对当前线程有效的连接,Thin在第二个线程而不是第一个线程中应用ConnectionManagement

编辑:

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

2016.05.18编辑:

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