【问题标题】:How do I reuse connections in ActiveRecord?如何在 ActiveRecord 中重用连接?
【发布时间】:2016-08-10 09:50:01
【问题描述】:

当我发现这个简单的 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。我第 6 次超时。在前 5 个 GET 中的每一个之后,还有一个为 newsletter.db 打开的读写文件描述符。我希望一直只有一个。

我如何告诉 ActiveRecord 重用连接?

【问题讨论】:

  • 通过查看该答案,我最终发现调用ActiveRecord::Base.clear_active_connections! 对我有用。我确实尝试了ActiveRecord::Base.connection.close,发现这样我关闭了连接,而不是将连接返回到连接池。我没有尝试config.ru 方法。

标签: ruby activerecord sinatra


【解决方案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 编辑:

我与 Thin 作者跟进了此问题,但在问题 307 之后此问题未解决。

【讨论】:

    猜你喜欢
    • 2014-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-30
    相关资源
    最近更新 更多