ruby - Sinatra 中的 Postgresql 连接

标签 ruby postgresql sinatra pg

我正在尝试在 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 的工作原理。我想确保我正确使用它。我是否需要担心每次都关闭它?如果我不手动关闭它,它会保持连接打开并耗尽资源,还是会在响应结束时自动关闭连接?

最佳答案

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

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

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

关于ruby - Sinatra 中的 Postgresql 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26879434/

相关文章:

javascript - Ruby/Sinatra/jQuery 应用程序未在 repl.it 中运行

javascript - 将 Post 请求发送回 Sinatra 路由

rspec - Sinatra、Rspec 和 Capybara 没有响应方法

javascript - 第一次加载页面时没有加载任何js文件

ruby-on-rails - 为什么我应该只在测试环境而不是开发或生产环境中在我的 Rails 应用程序上运行 rspec 规范?

java - 如何避免在 jOOQ 中对值进行引号

postgresql - 如果没有数据,使用限制非常慢

java - JRuby Warbler 未创建可用的可执行 JAR 文件

java - 哪些库已移植到不同的编程语言?

python - psycopg2.编程错误: column "none" does not exist - Update Statement