2010-07-16 3 views
11

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

Похоже, что DBIx::Connection поддерживает объединение пулов прикладного уровня.

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

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

+1

Я использую DBIx :: Connector (что DBIx :: Class использует внутренне), и это замечательно ... Я объединяю эти соединения с оболочкой объекта Moose, которая передает существующие экземпляры объектов, если параметры соединения идентичны. Это не сложно свернуть. – Ether

+1

@Ether - стоит ответить, IMHO – DVK

+0

@DVK: хорошо, я расширил это с ответом ... – Ether

ответ

8

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

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

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; 
} 
+0

Не могли бы вы поделиться всем кодом, пожалуйста, предоставьте решение для достижения с помощью Rose :: DB handler – Sethu

+0

@Sethu - это весь код. и я бы не рекомендовал использовать Rose :: DB в любом случае. – Ether

+0

является предопределенной функцией get_connection_info? если не любезно поделиться этой функцией тоже. – Sethu

5

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

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

+0

Я думаю, что бесплатная версия MySql поддерживает только 200 соединений? – bonez

+1

Бесплатная версия MySQL никоим образом не искалечена. (Если вы не считаете GPL, ха-ха.) Даже большие и плохо написанные приложения не должны превышать пару тысяч, но вы можете установить [max_connections] (http://dev.mysql.com/doc/refman/5.0 /en/server-system-variables.html#sysvar_max_connections) так высоко, как вы хотите, если у вас есть дескрипторы памяти и файла. –

+2

Нет «платной» версии MySQL. Это все GPL. В лучшем случае у Oracle может быть контракт на поддержку, за который вы могли бы заплатить, но само программное обеспечение полностью бесплатное и неконфликтное. –

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