gpt4 book ai didi

ruby - 如何重用 ActiveRecord 中的连接?

转载 作者:数据小太阳 更新时间:2023-10-29 07:19:00 24 4
gpt4 key购买 nike

当我发现连接不会被这个简单的 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!在每次使用 Subscriber.find_by_emailSubscriber.create 之后,就像这样。

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 之后没有得到解决。 .

关于ruby - 如何重用 ActiveRecord 中的连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36697685/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com