2010-07-16 19 views
11

Jetzt haben wir eine große Perl-Anwendung, die Raw DBI verwendet, um eine Verbindung zu MySQL herzustellen und SQL-Anweisungen auszuführen. Es erstellt jedes Mal eine Verbindung und endet. Begann sich an mysql's Verbindungslimit (200 auf einmal) zu nähernPerl Connection Pooling

Es sieht aus wie DBIx::Connection unterstützt Application-Layer-Verbindungspooling.

Hat jemand Erfahrung mit DBIx::Connection? Gibt es weitere Überlegungen zum Verbindungs-Pooling?

Ich sehe auch mod_dbd, die eine Apache-Mod ist, die aussieht wie es Verbindungspooling behandelt. http://httpd.apache.org/docs/2.1/mod/mod_dbd.html

+1

Ich benutze DBIx :: Connector (was DBIx :: Class verwendet intern) und es ist wunderbar ... Ich bündle diese Verbindungen mit einem Moose-Objekt-Wrapper, der vorhandene Objektinstanzen zurückgibt, wenn die Verbindungsparameter identisch sind. Es ist nicht schwer, selbst zu rollen. – Ether

+1

@Ether - eine Antwort wert, IMHO – DVK

+0

@DVK: ok, ich erweiterte dies mit einer Antwort ... – Ether

Antwort

8

Ich habe keine Erfahrung mit DBIx :: Verbindung, aber ich benutze DBIx::Connector (im Wesentlichen, was DBIx :: Klasse intern verwendet, aber inlined) und es ist wunderbar ...

I bündeln diese Verbindungen mit einem Elch Objekt-Wrapper, die identisch sind, wenn die Verbindungsparameter bestehende Objektinstanzen Hände zurück (dies würde das gleiche für all zugrunde liegendes DB-Objekt arbeitet):

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

können Sie bitte den gesamten Code teilen auch bitte die Lösung für das Erreichen mit Rose :: DB-Handler – Sethu

+0

@Sethu, dass der gesamte Code ist. und ich würde auf keinen Fall Rose :: DB empfehlen. – Ether

+0

ist get_connection_info vordefinierte Funktion? wenn nicht auch freundlicherweise diese Funktion teilen. – Sethu

5

nur sicherstellen, dass: Sie wissen über DBI->connect_cached(), nicht wahr? Es ist ein Drop-In-Ersatz für connect(), der DBHs, wenn möglich, über die Lebensdauer Ihres Perl-Skripts wiederverwendet. Vielleicht ist Ihr Problem lösbar durch Hinzufügen von 7 Zeichen :)

Und MySQL-Verbindungen sind relativ billig. Laufen mit Ihrer DB bei max_connections=1000 oder mehr wird nicht allein Probleme verursachen. (Wenn Ihre Kunden mehr Arbeit verlangen, als Ihre DB bewältigen kann, dann ist das ein gravierenderes Problem, das eine niedrigere max_connections aufschieben aber natürlich nicht lösen kann.)

+0

Ich denke, freie Version von MySql unterstützt nur 200 Verbindungen richtig? – bonez

+1

Die kostenlose Version von MySQL ist in keiner Weise verkrüppelt. (Es sei denn, Sie zählen die GPL, haha.) Selbst große und schlecht geschriebene Anwendungen sollten nicht mehr als ein paar Tausend benötigen, aber Sie können [max_connections] einstellen (http://dev.mysql.com/doc/refman/5.0 /en/server-system-variables.html#sysvar_max_connections) so hoch wie Sie möchten, wenn Sie die Speicher- und Dateideskriptoren haben. –

+2

Es gibt keine "kostenpflichtige" Version von MySQL. Es ist alles GPL. Im besten Fall kann Oracle einen Supportvertrag haben, den Sie bezahlen können, aber die Software selbst ist völlig kostenlos und unbeschränkt. –

Verwandte Themen