2 Stimmen

Wie kann ich den internen Cache von Class::DBI löschen?

Ich arbeite derzeit an einer großen Implementierung von Class::DBI für eine bestehende Datenbankstruktur, und bin in ein Problem mit dem Löschen des Cache von Class::DBI laufen. Dies ist eine mod_perl-Implementierung, so dass eine Instanz einer Klasse ziemlich alt sein kann, zwischen Zeiten, die es zugegriffen wird. In den Man Pages habe ich zwei Optionen gefunden:

Music::DBI->clear_object_index();

Und:

Music::Artist->purge_object_index_every(2000);

Wenn ich nun clear_object_index() zur DESTROY-Methode hinzufüge, scheint sie ausgeführt zu werden, leert aber nicht wirklich den Cache. Wenn ich die Datenbank manuell ändere und die Anforderung erneut ausführe, ist es immer noch die alte Version. purge_object_index_every sagt, dass der Index alle n Anfragen geleert wird. Wenn ich dies auf "1" oder "0" setze, scheint der Index zu löschen... manchmal. Ich würde erwarten, dass eine dieser beiden Einstellungen funktioniert, aber aus irgendeinem Grund tut sie das nicht jedes Mal. Eher 1 von 5 Mal.

Haben Sie einen Vorschlag, wie man das beseitigen kann?

5voto

John Siracusa Punkte 14511

Die " allgemeine Probleme " auf der Seite Klasse::DBI-Wiki hat eine Abschnitt zu diesem Thema. Die einfachste Lösung ist, den Live-Objekt-Index vollständig zu deaktivieren:

$Class::DBI::Weaken_Is_Available = 0;

2voto

Sean Punkte 4529

$obj->dbi_commit(); könnte das sein, wonach Sie suchen, wenn Sie nicht abgeschlossene Transaktionen haben. Dies ist jedoch nicht sehr wahrscheinlich, da es dazu neigt, alle verbleibenden Transaktionen bei der Zerstörung automatisch abzuschließen.

Wenn Sie dies tun:

Music::Artist->purge_object_index_every(2000);

Sie weisen es an, den Objekt-Cache alle 2000 Objektladungen zu untersuchen und alle toten Referenzen zu entfernen, um Speicherplatz zu sparen. Ich glaube nicht, dass Sie das überhaupt wollen.

Außerdem,

Music::DBI->clear_object_index();

Entfernt alle Objekte aus dem Live-Objekt-Index. Ich weiß nicht, wie dies überhaupt helfen würde; es ist nicht Flushing sie auf die Festplatte, wirklich.

Es hört sich so an, als ob das, was Sie zu tun versuchen, so, wie Sie es haben, gut funktionieren sollte, aber es kann ein Problem mit Ihrem SQL oder anderswo geben, das verhindert, dass INSERT oder UPDATE funktioniert. Führen Sie für jede Datenbankabfrage eine Fehlerprüfung durch, wie in der Perldoc vorgeschlagen? Vielleicht können Sie dort oder in Ihren Datenbank-Fehlerprotokollen beginnen und die Abfragen beobachten, um zu sehen, warum sie nicht abgeschlossen werden oder ob sie überhaupt ankommen.

Ich hoffe, das hilft!

0voto

zigdon Punkte 13865

Ich habe remove_from_object_index erfolgreich in der Vergangenheit verwendet, so dass, wenn eine Seite aufgerufen wird, die die Datenbank ändert, es immer explizit dieses Objekt im Cache als Teil der Bestätigungsseite zurückgesetzt.

-1voto

Shlomi Fish Punkte 4250

Ich sollte anmerken, dass Class::DBI veraltet ist und Sie Ihren Code auf DBIx::Klasse stattdessen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X