2010-07-16 13 views
11

Al momento disponiamo di un'ampia applicazione perl che utilizza DBI raw per connettersi a MySQL ed eseguire istruzioni SQL. Crea una connessione ogni volta e termina. Stavano iniziando ad avvicinarsi al limite di connessione di mysql (200 alla volta)Perl Connection Pooling

Sembra che DBIx::Connection supporti il ​​pool di connessioni del livello applicazione.

Qualcuno ha avuto esperienza con DBIx::Connection?. Ci sono altre considerazioni per il pooling delle connessioni?

Vedo anche mod_dbd che è un mod di Apache che sembra gestire il pool di connessioni. http://httpd.apache.org/docs/2.1/mod/mod_dbd.html

+1

Io uso DBIx :: Connector (quale DBIx :: Classe utilizza internamente) ed è meraviglioso ... Riconosco queste connessioni con un oggetto wrapper Moose che restituisce istanze di oggetti esistenti se i parametri di connessione sono identici. Non è difficile tirarne uno da solo. – Ether

+1

@Ether - vale la risposta, IMHO – DVK

+0

@DVK: ok, ho ampliato questo con una risposta ... – Ether

risposta

8

non ho alcuna esperienza con DBIx :: Connection, ma io uso DBIx::Connector (essenzialmente ciò che DBIx :: Class utilizza internamente, ma inline) ed è meraviglioso ...

ho Pool queste connessioni con un wrapper oggetto Moose che le mani di nuovo istanze di oggetti esistenti, se i parametri di connessione sono identici (questo dovrebbe funzionare lo stesso per qualsiasi oggetto DB sottostante):

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

potresti per favore condividere l'intero codice, per favore fornisci la soluzione per ottenere con il gestore di Rose :: DB – Sethu

+0

@Sethu che è l'intero codice. e in ogni caso non raccomanderei l'uso di Rose :: DB. – Ether

+0

è la funzione predefinita get_connection_info? se non gentilmente condividi anche quella funzione. – Sethu

5

Basta fare in modo: sai di DBI->connect_cached(), giusto? Si tratta di una sostituzione drop-in per connect() che riutilizza dbh, ove possibile, per la durata del tuo script perl. Forse il tuo problema è risolvibile aggiungendo 7 caratteri :)

E, le connessioni di MySQL sono relativamente economiche. L'esecuzione con il DB allo max_connections=1000 o più non comporta di per sé problemi. (Se i tuoi clienti richiedono più lavoro di quello che può gestire il tuo DB, si tratta di un problema più serio, uno più basso del max_connections potrebbe rimandare ma ovviamente non risolvere.)

+0

Penso che la versione gratuita di MySql supporti solo 200 connessioni, giusto? – bonez

+1

La versione gratuita di MySQL non è paralizzata in alcun modo. (A meno che non si contenga la GPL, haha.) Anche le applicazioni grandi e mal scritte non dovrebbero richiedere più di un paio di migliaia, ma è possibile impostare [max_connections] (http://dev.mysql.com/doc/refman/5.0 /en/server-system-variables.html#sysvar_max_connections) quanto vuoi, se hai i descrittori di memoria e file. –

+2

Non esiste una versione "a pagamento" di MySQL. È tutto GPL. Nel migliore dei casi, Oracle potrebbe avere un contratto di supporto che potresti pagare, ma il software stesso è completamente gratuito e privo di problemi. –