Как управлять соединениями 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;
}

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

Другие вопросы по тегам