Warum beschwert sich Apache, dass mein mod_perl-Programm "disconnect 1 aktive Anweisung ungültig macht"?

8
  

disconnect deaktiviert 1 aktiv   Anweisungshandle (entweder zerstören   Anweisung handle oder call finish on   sie vor dem Trennen)

Der folgende Code, der Daten aus MySQL aufnimmt, wird erfolgreich ausgeführt, aber Apache wird die obige Nachricht in seinem Fehlerprotokoll erzeugen:

%Vor%
  • Wird es schlimme Folgen haben? indem ich den besagten Fehler / die Warnung ignoriere? Der Code läuft seit einer Woche ohne irgendwelche negativen Auswirkungen.

  • Stimmt etwas nicht mit dem Code? oder ist das nur eine harmlose Warnung?

Bearbeiten

Code wird über mod_perl ausgeführt.

    
GeneQ 12.02.2009, 14:39
quelle

3 Antworten

12

Sie sollten $statement->finish(); vor $db_handle->disconnnect(); aufrufen.

Normalerweise müssen Sie finish nicht aufrufen, es sei denn, Sie erhalten nicht alle Zeilen. Wenn Sie alle Ergebnisse in einer Schleife mit fetchrow_array erhalten, rufen Sie am Ende nicht end auf, wenn Sie die Schleife nicht abgebrochen haben.

Ich bin mir nicht sicher, warum der MySQL-Treiber die Anweisung nicht nach einer fetchall_hashref beendet. Das Handbuch schlägt vor, dass Ihre Abfrage aufgrund eines Fehlers möglicherweise abgebrochen wird:

  

Wenn ein Fehler auftritt, fetchall_hashref   gibt die bisher abgerufenen Daten zurück,   das kann keiner sein. Das solltest du überprüfen   $ sth- & gt; err nachher (oder benutze die   RaiseError-Attribut), um zu erkennen, ob   Die Daten sind vollständig oder wurden abgeschnitten   aufgrund eines Fehlers.

    
Paul Tomblin 12.02.2009, 14:43
quelle
3

Dies wird dadurch verursacht, dass der Griff noch aktiv ist. Normalerweise sollte es sich jedoch schließen, aber Sie scheinen nicht alle Daten davon zu holen. Aus dem perldoc auf DBI:

  

Wenn alle Daten abgerufen wurden   aus einer SELECT-Anweisung der Treiber   sollte automatisch für beenden aufrufen   Sie. Also solltest du normalerweise nicht brauchen   um es explizit zu nennen, außer wenn du es bist   wisse, dass du nicht alle geholt hast   Daten von einem Anweisungshandle. Am meisten   geläufiges Beispiel ist, wenn Sie nur wollen   um eine Zeile zu holen, aber in diesem Fall die   Selectrow_ * Methoden sind in der Regel besser   sowieso. Anrufe hinzufügen, um danach zu beenden   Jede Abrufschleife ist ein häufiger Fehler,   tu es nicht, es kann echt maskieren   Probleme wie nicht abgeholte Abruffehler.

    
wds 12.02.2009 14:54
quelle
0

Obwohl wahrscheinlich nicht der Grund, warum Sie diese Warnung erhalten haben (was ist das Handbuch behauptet, dass es ist), habe ich die gleiche Warnung in etwas anderen Umständen erfahren und wollte es hier vorschlagen, anstatt meine eigene Frage zu öffnen.

Sie können sich in diesem Szenario befinden, wenn Sie eine Abfrage ausführen, um einige Zeilen abzurufen - aber nur, um zu wissen, ob Zeilen vorhanden sind, die übereinstimmen oder nicht. In meinem Fall werden wir die Zeilen aktualisieren, wenn eine Übereinstimmung gefunden wird, und andernfalls einfügen.

Da mit den gefundenen Zeilen nichts getan wird, glaube ich, dass dies ein Szenario darstellt, in dem es angemessen ist, der Warnung zu folgen. Daher rufe ich finish() auf meinem Select-Handler auf, bevor ich die Verbindung trennen kann.

Haftungsausschluss : Da es für DBI neu ist, gibt es möglicherweise einen besseren Ansatz. Ich hätte ->do() verwendet, außer die Dokumentation wies darauf hin, dass es nicht verwendet werden, wenn sie wiederholt ausgeführt werden - auch entmutigt wurden SELECT -Anweisungen aus irgendeinem Grund, auch!

Hier ist ein Perl-Pseudocode, der zeigt, worauf ich gelandet bin:

%Vor%

Ich hoffe, dies hilft jemand anderem und ist frei, meinen Ansatz zu korrigieren, wenn ich jemanden in die Irre führe.

    
veeTrain 03.12.2012 21:58
quelle

Tags und Links