2016-07-29 15 views
0

Ich brauche ein Array mit DBI-Verbindungsobjekte zu teilen mit anderen Prozess mit Shared Memory serialisieren. Aber Deserialize funktioniert nicht.Serialize und Deserialize perl DBI-Verbindungsobjekt

Verwendung speicherbare qw/Frost Tauwetter /;

my @connections; 

for(my $c = 0;$c < 5;$c++) { 
    my $conn = DBI->connect($dsn,$user,$password,{'AutoCommit' => 1, 'RaiseError' => 1, 'PrintError' => 0}); 
    push(@connections,$conn); 
} 

my $shm = freeze(@connections); 
my $obj = thaw($shm); 

Return-Fehler: Globales Symbol

"$drh" requires explicit package name (did you forget to declare "my $drh"?) at (eval 33) line 6.

+5

Das klingt nach einer schrecklichen Idee. Außerdem, wo ist der Rest Ihres Codes? – melpomene

+0

Mein Code hat 10 Pakete (Klasse). Meine Anwendung benötigt optimierte Nummernverbindungen mit der Datenbank. Meine Anwendung begann mit einer Verbindung mit der Datenbank, es gab 100 Gabeln, die Verbindungen teilten. Wenn ein Kind eine Verbindung öffnet, teilt es die Verbindung mit dem übergeordneten und anderen Prozess. Ich habe die gleichen Semaphore verwendet, um den Zugriff auf die Verbindungen zu kontrollieren. –

+0

Könnte ich Ihnen senden? –

Antwort

12

Sie können keine Datenbank-Handle/Verbindung serialisiert werden, da es von Benutzerraumdaten nicht erreichbar Storable (dh außerhalb Perl und in der Datenbank Bibliothek besteht und vielleicht auch in der TLS-Bibliothek) und auch Kerneldaten wie Dateideskriptoren.

+0

Also wie teile ich Verbindungen nach der Gabel? –

+2

@evertongava: fork ist ein Systemaufruf, der die gesamten Prozesse klont. Dies umfasst den gesamten Benutzerbereich und alle Kernel-Daten. Also wird es zuerst funktionieren. Es funktioniert jedoch möglicherweise nicht mehr, wenn Sie dasselbe Datenbank-Handle nach der Verzweigung mehrerer Prozesse verwenden, da möglicherweise ein Status betroffen ist, der nicht zwischen diesen Prozessen aufgeteilt wird. Dies kann bei Datenbanktreibern anders sein, aber es ist definitiv wahr, wenn die Datenbankverbindung mit TLS hergestellt wird. –

+0

Die Idee ist, eine Anwendung zu haben, die 10-100 Verbindungen mit Datenbank haben könnte. Ich starte ein Semget mit 100 Semaphoren, aber nur eine Verbindung. Wenn die Nachfrage steigt, öffnen Sie weitere Verbindungen und verwenden Sie weitere Semaphoren. Wenn die Nachfrage abnimmt und die Verbindungen für eine Minute inaktiv sind, sind sie geschlossen. Dieses System steuert On-Board-Computer von 300.000 Fahrzeugen 3.000 Nachrichten pro Minute. Aber es gibt Zeiten des Tages. Es braucht mehr Ressourcen und Zeiten. Es braucht weniger Ressourcen. Jedes Fahrzeug hat einen intelligenten Agenten (Prozess), der es für eine bestimmte Zeit verfolgt. Es ist ein Legacy-System aus Perl. –