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.
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.
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.
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 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.