Пул соединений - PullRequest
       19

Пул соединений

11 голосов
/ 16 июля 2010

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

Похоже, DBIx :: Connection поддерживает пул соединений на уровне приложений.

Кто-нибудь имел опыт работы с DBIx::Connection ?.Есть ли другие соображения для пула соединений?

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

Ответы [ 2 ]

9 голосов
/ 17 июля 2010

У меня нет опыта работы с 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;
}
5 голосов
/ 14 августа 2010

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

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

...