Question

Je travaille actuellement sur une grande implémentation de Class :: DBI pour une structure de base de données existante et je rencontre un problème avec la suppression du cache de Class :: DBI.Il s'agit d'une implémentation de mod_perl, donc une instance d'une classe peut être assez ancienne entre les accès.Dans les pages de manuel, j'ai trouvé deux options :

Music::DBI->clear_object_index();

Et:

Music::Artist->purge_object_index_every(2000);

Maintenant, lorsque j'ajoute clear_object_index() à la méthode DESTROY, elle semble s'exécuter, mais ne vide pas réellement le cache.Je peux modifier manuellement la base de données, réexécuter la demande et il s'agit toujours de l'ancienne version.purge_object_index_every dit qu'il efface l'index toutes les n requêtes.Régler ceci sur "1" ou "0", semble effacer l'index...parfois.Je m'attendrais à ce que l'un de ces deux fonctionne, mais pour une raison quelconque, il ne le fait pas à chaque fois.Plus comme 1 fois sur 5.

Des suggestions pour clarifier cela ?

Était-ce utile?

La solution

Le "problèmes communs"page sur le Classe ::DBI wiki a un section à propos de ce sujet.La solution la plus simple consiste à désactiver entièrement l'index des objets dynamiques en utilisant :

$Class::DBI::Weaken_Is_Available = 0;

Autres conseils

$obj->dbi_commit();C'est peut-être ce que vous recherchez si vous avez des transactions inachevées.Cependant, cela est peu probable, car il a tendance à terminer automatiquement toutes les transactions en suspens lors de la destruction.

Quand tu fais ça :

Music::Artist->purge_object_index_every(2000);

Vous lui dites d'examiner le cache d'objets tous les 2 000 chargements d'objets et de supprimer toutes les références mortes pour économiser la mémoire.Je ne pense pas du tout que ce soit ce que vous voulez.

En outre,

Music::DBI->clear_object_index();

Supprime tous les objets de l’index des objets actifs.Je ne sais pas du tout en quoi cela pourrait aider ;il ne s'agit pas vraiment de les vider sur le disque.

Il semble que ce que vous essayez de faire devrait fonctionner parfaitement tel que vous l'avez fait, mais il se peut qu'il y ait un problème avec votre SQL ou ailleurs qui empêche INSERT ou UPDATE de fonctionner.Effectuez-vous une vérification des erreurs pour chaque requête de base de données comme le suggère perldoc ?Vous pouvez peut-être commencer par là ou dans les journaux d'erreurs de votre base de données, en surveillant les requêtes pour voir pourquoi elles ne sont pas terminées ou si elles arrivent un jour.

J'espère que cela t'aides!

J'ai utilisé avec succès remove_from_object_index dans le passé, de sorte que lorsqu'une page est appelée et modifie la base de données, elle réinitialise toujours explicitement cet objet dans le cache dans le cadre de la page de confirmation.

Je dois noter que Class::DBI est obsolète et que vous devez porter votre code sur DBIx :: Classe plutôt.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top