Организация пула подключений Perl

Прямо сейчас у нас есть большое приложение жемчуга, которое использует необработанный DBI, чтобы соединиться с MySQL и выполнить SQL-операторы. Это создает соединение каждый раз и завершается. Запуск должен был приблизиться к ограничению соединения mysql (200 сразу)

Это похоже на DBIx:: Соединение поддерживает организацию пула подключений прикладного уровня.

Имеет кого-либо, имел любой опыт с DBIx::Connection?. Есть ли какие-либо другие соображения для организации пула подключений?

Я также вижу mod_dbd то, которое является модификацией Apache, которая похожа на него, обрабатывает организацию пула подключений. http://httpd.apache.org/docs/2.1/mod/mod_dbd.html

11
задан Ether 16 July 2010 в 18:59
поделиться

2 ответа

У меня нет опыта работы с DBIx :: Connection, но я использую DBIx :: Connector (по сути, то, что DBIx :: Class использует внутри, но встроено) и это замечательно ...

Я объединяю эти соединения с оболочкой объекта Moose, которая возвращает существующие экземпляры объекта, если параметры соединения идентичны (это будет работать одинаково для любого базового объекта БД):

package MyApp::Factory::DatabaseConnection;
use strict;
use warnings;

use Moose;

# table of database name -> connection objects
has connection_pool => (
    is => 'ro', isa => 'HashRef[DBIx::Connector]',
    traits  => ['Hash'],
    handles => {
        has_pooled_connection => 'exists',
        get_pooled_connection => 'get',
        save_pooled_connection => 'set',
    },
    default => sub { {} },
);

sub get_connection
{
    my ($self, %options) = @_;

    # some application-specific parsing of %options here...

    my $obj;
    if ($options{reuse})
    {
        # extract the last-allocated connection for this database and pass it
        # back, if there is one.
        $obj = $self->get_pooled_connection($options{database});
    }

    if (not $obj or not $obj->connected)
    {
        # look up connection info based on requested database name
        my ($dsn, $username, $password) = $self->get_connection_info($options{database});
        $obj = DBIx::Connector->new($dsn, $username, $password);

        return unless $obj;

        # Save this connection for later reuse, possibly replacing an earlier
        # saved connection (this latest one has the highest chance of being in
        # the same pid as a subsequent request).
        $self->save_pooled_connection($options{database}, $obj) unless $options{nosave};
    }

    return $obj;
}
9
ответ дан 3 December 2019 в 08:28
поделиться

Просто убедитесь: вы знаете о DBI-> connect_cached () , верно? Это прямая замена для connect () , которая повторно использует dbh, где это возможно, в течение всего срока службы вашего Perl-скрипта. Возможно, вашу проблему можно решить, добавив 7 символов :)

И соединения MySQL относительно дешевы. Работа с вашей БД при max_connections = 1000 или более сама по себе не вызовет проблем. (Если вашим клиентам требуется больше работы, чем может обработать ваша БД, это более серьезная проблема, которую можно отложить при более низком max_connections , но, конечно, не решить.)

5
ответ дан 3 December 2019 в 08:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: