Frage

Ich arbeite derzeit an einer großen Implementierung von Class::DBI für eine vorhandene Datenbankstruktur und habe ein Problem beim Löschen des Caches von Class::DBI.Dies ist eine mod_perl-Implementierung, daher kann eine Instanz einer Klasse zwischen den Zugriffen auf sie ziemlich alt sein.Auf den Manpages 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 zu laufen, aber der Cache wird nicht wirklich geleert.Ich kann die Datenbank manuell ändern, die Anfrage erneut ausführen und es ist immer noch die alte Version.purge_object_index_every sagt, dass der Index alle n Anfragen gelöscht wird.Wenn Sie dies auf „1“ oder „0“ setzen, scheint der Index gelöscht zu werden ...Manchmal.Ich würde erwarten, dass eines dieser beiden funktioniert, aber aus irgendeinem Grund funktioniert es nicht jedes Mal.Eher 1 von 5 Mal.

Irgendwelche Vorschläge, wie man das klären kann?

War es hilfreich?

Lösung

Der "allgemeine Probleme" Seite auf der Klasse::DBI-Wiki hat ein Abschnitt zu diesem Thema.Die einfachste Lösung besteht darin, den Live-Objektindex vollständig zu deaktivieren, indem Sie Folgendes verwenden:

$Class::DBI::Weaken_Is_Available = 0;

Andere Tipps

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

Wenn Sie dies tun:

Music::Artist->purge_object_index_every(2000);

Sie weisen es an, den Objektcache alle 2000 Objektladevorgänge zu untersuchen und alle toten Referenzen zu entfernen, um Speicher zu sparen.Ich glaube nicht, dass du das überhaupt willst.

Außerdem,

Music::DBI->clear_object_index();

Entfernt alle Objekte aus dem Live-Objektindex.Ich weiß nicht, wie das überhaupt helfen würde;Es geht eigentlich nicht darum, sie auf die Festplatte zu schreiben.

Es hört sich so an, als ob das, was Sie versuchen, so wie Sie es haben, einwandfrei funktionieren sollte, aber möglicherweise liegt ein Problem mit Ihrem SQL oder anderswo vor, das die Funktion von INSERT oder UPDATE verhindert.Führen Sie für jede Datenbankabfrage eine Fehlerprüfung durch, wie im Perldoc vorgeschlagen?Vielleicht können Sie dort oder in den Fehlerprotokollen Ihrer Datenbank beginnen und die Abfragen beobachten, um zu sehen, warum sie nicht abgeschlossen werden oder ob sie jemals eintreffen.

Hoffe das hilft!

Ich habe „remove_from_object_index“ in der Vergangenheit erfolgreich verwendet, sodass beim Aufruf einer Seite, die die Datenbank ändert, dieses Objekt im Cache immer explizit als Teil der Bestätigungsseite zurückgesetzt wird.

Ich sollte beachten, dass Class::DBI veraltet ist und Sie Ihren Code nach portieren sollten DBIx::Klasse stattdessen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top