当我发现这个简单的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重用连接?
答案 0 :(得分:1)
清除关联的一种方法是在每次使用Subscriber.find_by_email
和Subscriber.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之后无法解决。