Domanda

Attualmente sto lavorando su un'implementazione di grandi dimensioni di Class::DBI per una struttura di database esistente e sto riscontrando un problema con lo svuotamento della cache da Class::DBI.Questa è un'implementazione mod_perl, quindi un'istanza di una classe può essere piuttosto vecchia tra un accesso e l'altro.Dalle pagine man ho trovato due opzioni:

Music::DBI->clear_object_index();

E:

Music::Artist->purge_object_index_every(2000);

Ora, quando aggiungo clear_object_index() al metodo DESTROY, sembra che venga eseguito, ma in realtà non svuota la cache.Sono in grado di modificare manualmente il database, rieseguire la richiesta ed è ancora la vecchia versione.purge_object_index_every dice che cancella l'indice ogni n richieste.Impostandolo su "1" o "0", sembra cancellare l'indice...A volte.Mi aspetto che uno di questi due funzioni, ma per qualche motivo non lo fa ogni volta.Più o meno 1 volta su 5.

Qualche suggerimento per risolvere questo problema?

È stato utile?

Soluzione

IL "problemi comuni"pagina sul Classe::DBI wiki ha un sezione su questo argomento.La soluzione più semplice è disabilitare completamente l'indice degli oggetti live utilizzando:

$Class::DBI::Weaken_Is_Available = 0;

Altri suggerimenti

$oggetto->dbi_commit();potrebbe essere quello che stai cercando se hai transazioni non completate.Tuttavia, questo non è molto probabile, poiché tende a completare automaticamente qualsiasi transazione persistente dopo la distruzione.

Quando fai questo:

Music::Artist->purge_object_index_every(2000);

Gli stai dicendo di esaminare la cache degli oggetti ogni 2000 caricamenti di oggetti e di rimuovere eventuali riferimenti morti per conservare l'utilizzo della memoria.Non penso affatto che sia quello che vuoi.

Inoltre,

Music::DBI->clear_object_index();

Rimuove tutti gli oggetti dall'indice degli oggetti live.Non so come questo potrebbe aiutare;in realtà non li sta scaricando su disco.

Sembra che quello che stai cercando di fare dovrebbe funzionare bene così come lo hai, ma potrebbe esserci un problema con il tuo SQL o altrove che impedisce il funzionamento di INSERT o UPDATE.Stai eseguendo il controllo degli errori per ogni query del database come suggerisce Perldoc?Forse puoi iniziare da lì o nei registri degli errori del database, osservando le query per vedere perché non vengono completate o se mai arrivano.

Spero che questo ti aiuti!

Ho utilizzato Remove_from_object_index con successo in passato, in modo che quando viene chiamata una pagina che modifica il database, reimposta sempre esplicitamente l'oggetto nella cache come parte della pagina di conferma.

Dovrei notare che Class::DBI è deprecato e dovresti trasferire il tuo codice su DBIx::Classe Invece.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top