2010-07-16 21 views
11

En este momento tenemos una aplicación de perl grande que está utilizando DBI sin procesar para conectarse a MySQL y ejecutar sentencias de SQL. Crea una conexión cada vez y termina. Estamos comenzando a acercarnos al límite de conexión de mysql (200 a la vez)Perl Connection Pooling

Parece que DBIx::Connection admite la agrupación de conexiones de la capa de aplicaciones.

¿Alguien ha tenido alguna experiencia con DBIx::Connection?. ¿Hay alguna otra consideración para el agrupamiento de conexiones?

También veo mod_dbd que es un mod de Apache que parece que maneja la agrupación de conexiones. http://httpd.apache.org/docs/2.1/mod/mod_dbd.html

+1

Uso DBIx :: Connector (qué DBIx :: Class se usa internamente) y es maravilloso ... Inmovilizo estas conexiones con un contenedor de objetos Moose que devuelve las instancias de objetos existentes si los parámetros de conexión son idénticos. No es difícil hacer el tuyo. – Ether

+1

@Ether - vale la pena una respuesta, en mi humilde opinión – DVK

+0

@DVK: vale, amplié esto con una respuesta ... – Ether

Respuesta

8

que no tienen ninguna experiencia con DBIx :: Conexión, pero yo uso DBIx::Connector (esencialmente lo DBIx :: Clase utiliza internamente, pero en línea) y es maravilloso ...

que estas conexiones piscina con un envoltorio objeto alces que da vuelta instancias de objetos existentes, si los parámetros de conexión son idénticos (esto funcionaría de la misma para cualquier objeto que subyace DB):

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

¿podría compartir el código completo? Por favor, proporcione la solución para lograrlo con Rose :: DB handler – Sethu

+0

@Sethu que es el código completo. y no recomendaría usar Rose :: DB en ningún caso. – Ether

+0

es la función predefinida get_connection_info? si no amablemente comparte esa función también. – Sethu

5

Sólo me aseguraba: conocer DBI->connect_cached(), ¿verdad? Es un reemplazo directo para connect() que reutiliza dbh's, donde sea posible, durante la vida de su script de Perl. Tal vez su problema se puede resolver agregando 7 caracteres :)

Y, las conexiones de MySQL son relativamente baratas. Ejecutar con su base de datos en max_connections=1000 o más por sí mismo no causará problemas. (Si sus clientes exigen más trabajo de lo que su DB puede manejar, ese es un problema más serio, uno que max_connections más bajo puede posponer, pero por supuesto no resolver.)

+0

Creo que la versión gratuita de MySql solo admite 200 conexiones, ¿verdad? – bonez

+1

La versión gratuita de MySQL no está paralizada de ninguna manera. (A menos que cuente la GPL, jaja). Incluso las aplicaciones grandes y mal escritas no deberían necesitar más de un par de miles, pero puede establecer [max_connections] (http://dev.mysql.com/doc/refman/5.0 /es/server-system-variables.html#sysvar_max_connections) tan alto como desee, si tiene la memoria y los descriptores de archivos. –

+2

No hay una versión "paga" de MySQL. Es todo GPL. En el mejor de los casos, Oracle podría tener un contrato de soporte por el que podría pagar, pero el software en sí es completamente gratuito y sin suscripciones. –