【问题标题】:ActiveRecord connection warning. (Database connections will not be closed automatically)ActiveRecord 连接警告。 (数据库连接不会自动关闭)
【发布时间】:2012-04-28 19:26:56
【问题描述】:

我正在尝试使用 Sinatra 和 ActiveRecord (3.2.3) 创建一个小应用程序。

这是我的主文件的样子:

require "sinatra"
require "sinatra/reloader"
require "active_record"
...

ActiveRecord::Base.establish_connection(
  adapter:  'sqlite3',
  database: 'db.sqlite3',
  host:     'localhost',
)

class Post < ActiveRecord::Base
  ...
end

get('/') { ... }
get('/posts') { ... }
...

它可以工作,但有时我会在控制台中收到警告:

弃用警告:不会关闭数据库连接 自动,请在结束时关闭您的数据库连接 通过在您的连接上调用 close 进行线程。例如: ActiveRecord::Base.connection.close'

当出现警告时,页面刷新需要很长时间。 我不明白我应该在哪里关闭连接。我尝试将ActiveRecord::Base.connection.close 放在文件底部,但没有帮助。

更新:

我忘了提到我还使用来自sinatra-contrib gem 的 sinatra/reloader 插件来查看效果而无需重新启动服务器。

require "sinatra/reloader"

如果我将其注释掉,那么问题就会消失。但无论如何,我想知道如何在不禁用重新加载器的情况下解决这个问题。

【问题讨论】:

    标签: ruby activerecord sinatra


    【解决方案1】:

    您需要在堆栈中添加一个中间件。 只需将此行添加到您的 config.ru 机架文件:

    use ActiveRecord::ConnectionAdapters::ConnectionManagement
    

    在这里找到答案:https://github.com/puma/puma/issues/59

    【讨论】:

      【解决方案2】:

      在 Sinatra on Thin(线程模式)中,接受的答案对我不起作用。相反,我使用了:

      after do
        ActiveRecord::Base.connection.close
      end
      

      【讨论】:

      • 我发现对我来说也是如此。有谁知道为什么会这样?对于确实让这个工作的人,你用什么做服务器?
      • 这个答案适用于一个 db_pool 为 10 在 puma 上运行的 sinatra 应用程序。
      【解决方案3】:
      ActiveRecord::Base.remove_connection
      

      对我来说很好,并在文档中列出。

      【讨论】:

      • 欢迎来到 StackOverflow!这不能作为答案,可能应该是评论。
      • @Adam rubydoc.info/gems/activerecord/5.1.0/ActiveRecord/… - 不再需要数据库时调用该方法。
      • @Weary Adventurer 抱歉,如果这不合适。我专注于作者的评论,即 connection_close 方法什么也没做,并发现这是手动关闭连接的正确方法。有点忽略了他们想要一个自动解决方案
      • 在帮助选项卡中查看 StackOverflow 的指南如何写出好的答案。
      猜你喜欢
      • 1970-01-01
      • 2015-05-02
      • 1970-01-01
      • 1970-01-01
      • 2016-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多