2013-09-02 2 views
0

Я пытаюсь написать веб-сайт в Perl с Mason. Я настраиваю сервер со следующим: - Apache с mod_perl с Mason - CGI :: Session для управления сеансом - MongoDB для базы данных.Как управлять подключениями MongoDB на веб-сайте Perl/Mason

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

Кто-нибудь есть способ:

  • либо закрыть соединение (которое не может быть хорошей идеей)?
  • либо имеют глобальный пул соединений db, зная архитектуру?
+0

Потребности более подробно. Как вы открываете соединения, и где вы держите ручки? Можете ли вы опубликовать код для * минимального *, но запускаемого примера, который показывает проблему? (В mod_perl процесс выдает каждый запрос, поэтому глобальные переменные хранятся от одного вызова к другому. У вас может быть утечка - вы используете глобальные переменные, где вы должны использовать лексики? OTOH, вы можете использовать глобальную переменную для хранения одно соединение для всех запросов.) – amon

ответ

2

Драйвер MongoDB поддерживает соединение до тех пор, пока существует экземпляр MongoClient. В среде, такой как mod_perl, интерпретатор Perl является постоянным процессом, и глобальные переменные будут зависать до тех пор, пока они не будут уничтожены.

Если вы не хотите, чтобы соединения были постоянными, создайте объект MongoClient с областью действия, которая закончится, когда цикл запроса HTTP будет завершен. Соединения будут закрыты, когда объекты будут собраны в мусор.

Если вы уточните свой вопрос с более подробной информацией о том, как вы создаете объекты клиента, я могу предоставить более подробный ответ.

0

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

Мы используем 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; 
} 

Очевидно, я пропущенная ошибкой ловлю, а остальное не нужно, но, надеюсь, это поможет кому-то, как я искал решение это.

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