hotti: Cache DB Connections

Beitrag lesen

Hallo,

Noch besser ist es, nicht nur eine DB-Verbindung einzusetzen, sondern einen Connection Pool, der dann gleich eine ganze Reihe von Datenbank-Verbindungen vorhält.

Wie ich vor ein paar Tagen erwähnte, eröffnen mod_perl und mod_fastcgi auch andere Möglichkeiten: Datenbank-Verbindungen werden im eigenen Haptspeicher gecached.

Beispiel Data Abstraction Layer für MySQL, Parameter zum Herstellen der Verbindung sind Name der Datenbank und Name der Tabelle:

  
# Datei factory/dalmysql.pm  
# Data Abstraction Layer MySQL  
  
use strict;  
use warnings;  
use MySQLEAV;  
  
# Cache MySQL Connections  
# Zwei Schlüssel im Hash: tabn, base  
my %CC_DAL = ();  
  
  
sub dalmysql{  
    my $self = shift;  
    my %in = (  
        tabn => '',  
        base => '',  
    @_);  
  
    my $dal = $CC_DAL{$in{base}}{$in{tabn}} || do{  
        $CC_DAL{$in{base}}{$in{tabn}} = MySQLEAV->new(%in) or die $@;  
        $CC_DAL{$in{base}}{$in{tabn}};  
    };  
  
    return $dal;  
}  
  
1;  

Beim ersten Aufruf der Methode wird die Verbindung hergestellt und verbleibt danach im Hauptspeicher, das ist der Hash %CC_DAL.
Bei jedem weiteren Aufruf mit denselben Parametern (DB-Name, Tab-Name) wird keine neue Verbindung hergestellt, sondern die Instanz aus dem RAM geladen. Bei Aufrufen mit anderen Parametern passiert dasselbe.

Das ist sozusagen ein Lazy-Load: Zu Beginn, beispielsweise beim Starten des Webservers gibt es faktisch gar keinen Pool, der wird dynamisch verwaltet.

MfG