2014-11-12 2 views
0

Я пытаюсь сделать простой API в Sinatra как практика. У меня есть код, как показано ниже:Postgresql соединения в Sinatra

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. Я хочу убедиться, что правильно его использую. Нужно ли мне беспокоиться о том, чтобы закрыть его каждый раз? Если я не закрою его вручную, он оставит соединение открытым и вытолкнет ресурсы, или он автоматически закроет соединение в конце ответа?

ответ

1

Как указано, он не открывает новое соединение каждый раз. Он открывает соединение только тогда, когда вы вызываете PG::Connection.new, который расположен так, что он в основном запускается только. В результате, когда вы закрываете его после первого запроса, он закрывается навсегда.

Как вы хотите управлять своим подключением, зависит от ваших ожидаемых характеристик нагрузки. Вы можете открывать и закрывать соединение каждый раз, вы можете поддерживать пул соединений, вы можете использовать одно долгоживущее соединение.

Если это только для вашего тестового API, вам будет проще всего открывать и закрывать каждый раз или просто открывать одно долгоживущее соединение и перезапускать ваш сервер, если соединение произойдет с тайм-аутом в любой точке ,

+0

Как вы рекомендуете это делать в производственной среде? – searsaw

+1

Используйте пул соединений: http://en.wikipedia.org/wiki/Connection_pool –

2

Не закрывайте соединение вручную. Он закрывается сам по себе, если сценарий заканчивается, но в зависимости от среды развертывания сценарий, вероятно, будет открыт для многих запросов. Ruby слишком медленно перезагружается при каждом запросе.

Смежные вопросы