如何重用 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_email
和 Subscriber.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之后没有得到解决。
当我发现连接不会被这个简单的 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_email
和 Subscriber.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之后没有得到解决。