【问题标题】:Postgresql connections in SinatraSinatra 中的 Postgresql 连接
【发布时间】:2014-11-12 12:58:36
【问题描述】:

我正在尝试在 Sinatra 中制作一个简单的 API 作为练习。我有如下代码:

require 'pg'
...
db_params = {
  host: 'localhost',
  dbname: 'dbname',
  user: 'user',
  password: 'password'
}
psql = PG::Connection.new(db_params)

before { content_type 'application/json' }
after { psql.close }

get '/' do
  beer = psql.exec_params('SELECT * FROM beers LIMIT 20')
  ...
end

我注意到当我点击 URL 时,我得到了我的结果。如果我相对较快地再次点击它,它会返回连接已关闭。这是有道理的,因为我在发送响应后关闭了连接。但是,我的假设是它会在下一个请求时打开另一个连接。我可能误解了 PG gem 的工作原理。我想确保我正确使用它。我需要担心每次都关闭它吗?如果我不手动关闭它,它会保持连接打开并耗尽资源,还是会在响应结束时自动关闭连接?

【问题讨论】:

    标签: ruby postgresql sinatra pg


    【解决方案1】:

    正如所写,它不会每次都打开一个新连接。它仅在您调用PG::Connection.new 时打开一个连接,该连接的位置使其基本上只是启动。因此,当您在第一次请求后关闭它时,它会永久关闭。

    您希望如何处理连接取决于您的预期负载特性。你可以每次打开和关闭一个连接,你可以维护一个连接池,你可以使用一个长寿命的连接。

    如果这只是用于您的测试 API,那么您最简单的方法是每次都打开和关闭,或者只打开一个长期存在的连接并在连接发生超时时重新启动您的服务器。

    【讨论】:

    • 您如何建议在生产环境中执行此操作?
    【解决方案2】:

    不要手动关闭连接。如果脚本结束,它将自行关闭,但根据您的部署环境,脚本可能会为许多请求保持打开状态。 Ruby 太慢了,无法根据每个请求重新加载。

    【讨论】:

      猜你喜欢
      • 2016-03-28
      • 2013-03-18
      • 1970-01-01
      • 2010-10-19
      • 1970-01-01
      • 2012-12-01
      • 2019-12-18
      • 1970-01-01
      • 2016-07-16
      相关资源
      最近更新 更多