Ich benutze Apache2.2 (Arbeiter)/mod_perl 2.0.4/Apache :: DBI/CGI :: Session und Firebird RDBMS.DBI zwischengespeicherten Anweisungen gegangen und CGI :: Sitzung ist stecken geblieben
Ich schrieb auch CGI :: Session :: Driver :: firebird.pm, um mit Firebird RDBMS zu arbeiten. DB-Verbindung wird von Apache :: DBI gebündelt und gibt Verbindungshandle zu CGI :: Session {Handle => $ dbh}.
Die Nummer der DB-Verbindung entspricht der Anzahl der Worker-Prozesse.
Ich postete Programming with Apache::DBI and firebird. Get Stucked httpd on exception 3 Monat. Ich habe einen Grund für dieses Problem gefunden und möchte wissen, wie ich es beheben kann.
$dbh = DBI->connect("dbi:Firebird:db=$DBSERVER:/home/cdbs/xxnet.fdb;
ib_charset=UTF8;ib_dialect=3",$DBUSER,$DBPASS,{
AutoCommit=>1,
LongReadLen=>8192,
RaiseError=>1
});
my $session = new CGI::Session('dbi:firebird',$sessid,{Handle=>$dbh});
my $ses_p1 = $session->param('p1');
eval { $dbh->begin_work()
my $sql = "SELECT * FROM SAMPLETABLE"
my $st = $dbh->prepare($sql);
$st->execute();
while (my $R = $st->fetchrow_hashref()) {
...
}
$st->finish();
}; warn [email protected] if [email protected];
if ([email protected]) {
$dbh->rollback();
}else{
$dbh->commit();
}
$session->flush();
wenn eine SQL-Fehler aufgetreten ist, fängt ein eval Block Ausnahme und Rollback-Transaktion. Danach ruft CGI :: Session das Sitzungsobjekt nicht mehr ab.
Da die prepare_cached-Anweisung bei CGI :: Session :: DBI.pm fehlschlägt. CGI :: Session :: DBI.pm verwenden prepare_cached ($ sql, undef, 3). '3' ist der sicherste Weg, eine zwischengespeicherte Anweisung zu verwenden, aber in dieser Situation findet sie niemals eine fehlerhafte Anweisung.
Wie behebt man das? Anforderung erhöhen, um CGI :: Session :: DBI.pm zu ändern, um prepare() -Anweisung zu verwenden? write store(), retrieve(), traverse() Funktion in firebird.pm Prepare() Anweisung zu verwenden?
Es kann andere prepare_cached() gehen nach Fang Ausnahme scheitern ...
1) I auf CGI-Chip-Anweisung hinzufügen :: Session-> errstr() ich einen Fehler bekam „neue (): failed: load(): Daten konnte nicht abgerufen werden: retrieve(): $ sth-> Ausführen fehlgeschlagen mit Fehlermeldung " 2) Ich lege das Session-Objekt nach Sitzung-> load() wenn $ Sitzung gültig ist, ändert sich sind in der DB gespeichert. 3) Ich ersetze begin_work() zu {AutoCommit} = 0 Ergebnisse sind gleich. Ich kann $ dbh normalerweise nach Abfangen von Ausnahme und Rollback verwenden, aber neue CGI :: Session gibt Fehler zurück. ------------------------------------------ hinzugefügt am 2017/07/26 18 : 47 JST
Bitte geben Sie mir Ihren Vorschlag.
Vielen Dank.
vielleicht 'Session-> Flush' kills Sitzung? vielleicht soll man irgendeinen Wert von '$ sessid' entfernen? –
$ session-> flush() löst keine Ausnahmen aus. Nach $ session-> flush() funktioniert eine andere Abfrage gut, aber nächste "neue CGI :: Session()" gibt leer zurück. CGI :: Session-> load() gibt undef zurück. –
Ich testete es auch durch Entfernen von $ session-> flush(), aber nächste CGI: Sitzung leer zurückgegeben. –