Как управлять соединениями MongoDB на веб-сайте Perl/Mason
Я пытаюсь написать сайт на Perl с Мейсоном. Я установил сервер со следующим: - Apache с mod_perl с Mason - CGI::Session для управления сессией - MongoDB для базы данных.
Меня беспокоит то, что каждый раз, когда я подключаюсь к базе данных MongoDB, соединение остается активным, пока я не перезапущу службу httpd. Таким образом, если достигнуто максимальное соединение, я не могу больше открывать соединения.
У кого-нибудь есть способ:
- либо закрыть соединение (что может быть не очень хорошая идея)?
- либо есть глобальный пул соединений БД, зная архитектуру?
2 ответа
Драйвер MongoDB поддерживает соединение, пока ваш MongoClient
экземпляр существует. В такой среде, как mod_perl
интерпретатор Perl - это постоянный процесс, и глобальные переменные будут зависать, пока не будут уничтожены.
Если вы не хотите, чтобы соединения были постоянными, создайте MongoClient
объект с областью действия, которая завершится после завершения цикла HTTP-запроса. Соединения будут закрыты, когда объекты будут собирать мусор.
Если вы обновите свой вопрос с более подробной информацией о том, как вы создаете свои клиентские объекты, я могу дать более подробный ответ.
Я недавно боролся с этим. Я пришел к очень простому решению, которое работает для меня. Это может быть не самым лучшим, но, кажется, делает работу просто отлично.
Мы используем Mojolicious в качестве инфраструктуры API, работающей под apache2/mod_perl, и обнаружили, что новые подключения выполнялись быстрее, чем драйвер perl MongoDB очищал их, поскольку наша веб-страница вызывала API для получения новых данных.
Итак, я вставил простой...
use strict;
use warnings;
use MongoDB;
our $conn;
if(!defined($conn)){
$log->info("Creating new DB connection");
$conn = MongoDB::MongoClient->new;
}
else{
$log->info("DB connection already exists");
}
sub fetchData {
# Do Mongo get/find stuff in here
my $dbh = $mongoConn->get_database($db);
my $collection = $dbh->get_collection($col);
my $cursor = $collection->find($q)->fields($fieldsObj);
my @result = $cursor->all;
return @result;
}
Очевидно, я пропустил перехват ошибок, а остальное не нужно, но, надеюсь, это поможет кому-то вроде меня искать решение этой проблемы.