我正在尝试在 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/