10

我正在尝试使用 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"

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

4

3 回答 3

13

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

use ActiveRecord::ConnectionAdapters::ConnectionManagement

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

于 2012-04-18T15:03:23.427 回答
13

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

after do
  ActiveRecord::Base.connection.close
end
于 2012-12-18T06:43:19.033 回答
1
ActiveRecord::Base.remove_connection

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

于 2017-05-08T19:46:00.417 回答