Нужно ли размещать соединение / инициализацию БД вне цикла FCGI, чтобы использовать преимущества FastCGI в Perl? - PullRequest
6 голосов
/ 16 октября 2008

Допустим, у меня есть некоторый Perl-код, который увеличивает столбец в определенной строке базы данных при каждом обращении к нему, и я ожидаю, что он будет выполняться довольно часто, поэтому я хотел бы оптимизировать его с помощью FCGI , Прямо сейчас я в основном обернул большую часть кода примерно так:

while (FCGI::accept() >= 0) {
 [code which currently creates a db connection and makes calls through it]
}

Мне интересно, лучше ли установить соединение с базой данных (мой $ dbh = DBI-> connect (и т. Д.)) Вне цикла FCGI, чтобы скрипт поддерживал соединение, или я все равно получу преимущества FCGI в скорости и ресурсах, оставляя это в цикле?

Ответы [ 4 ]

3 голосов
/ 16 октября 2008

bmdhacks правильно, что если вы используете MySQL или PostgreSQL, это не имеет большого значения, так как соединения довольно дешевые. Но независимо от вашей базы данных у вас будет увеличение скорости при использовании постоянных соединений.

Но если вы решите использовать постоянные соединения, вам придется беспокоиться о тайм-аутах соединения. Это произойдет в любое время в течение срока действия вашей программы в зависимости от настроек вашего сервера и объема получаемого вами трафика. ping() твой друг здесь. И если вам нужна дополнительная помощь, посмотрите, как это делает Apache::DBI.

2 голосов
/ 18 октября 2008

Не помещайте соединение вне петли, вы можете потерять соединение, и тогда вы не сможете восстановить соединение. Вы можете поместить его в глобальный, но тогда вам придется проверить соединение и подключиться самостоятельно.

Вместо этого используйте Ima :: DBI или DBI->connect_cached(), чтобы выполнить кэширование соединений за вас. Он выполнит всю работу, чтобы убедиться, что соединение живо, и при необходимости восстановится.

Но, прежде чем заморачиваться, проведите сравнительный анализ, чтобы выяснить, где на самом деле находится ваше узкое место. В прошлом у меня было узкое место в связи с базой данных, но это было с Oracle, и это было более 10 лет назад.

1 голос
/ 16 октября 2008

Производительность подключения во многом зависит от базы данных, которую вы используете. PostgreSQL и MySQL очень быстро соединяются (особенно MySQL) и, таким образом, обычно подключаются при каждом запросе. Другие базы данных, такие как Oracle, работают немного медленнее и требуют большего времени жизни соединения. Это должно быть легко проверить, написав цикл 1..100000 с помощью DBI-> connect () и отключившись, чтобы увидеть, насколько быстро работает ваша база данных.

1 голос
/ 16 октября 2008

Вы все равно выиграете от FCGI, даже если вы сохраняете соединение с БД в цикле - но вы получите еще больше, если переместите его.

...