Pergunta

Atualmente estou trabalhando em uma grande implementação de Class::DBI para uma estrutura de banco de dados existente e estou enfrentando um problema ao limpar o cache de Class::DBI.Esta é uma implementação mod_perl, portanto, uma instância de uma classe pode ser bastante antiga entre os momentos em que é acessada.Nas páginas de manual, encontrei duas opções:

Music::DBI->clear_object_index();

E:

Music::Artist->purge_object_index_every(2000);

Agora, quando adiciono clear_object_index() ao método DESTROY, ele parece ser executado, mas na verdade não esvazia o cache.Consigo alterar manualmente o banco de dados, executar novamente a solicitação e ainda é a versão antiga.purge_object_index_every diz que limpa o índice a cada n solicitações.Definir isso como "1" ou "0" parece limpar o índice...às vezes.Eu esperaria que um desses dois funcionasse, mas por algum motivo isso não acontece sempre.Mais como 1 em 5 vezes.

Alguma sugestão para limpar isso?

Foi útil?

Solução

O "problemas comuns"página do Classe::Wiki do DBI tem um seção nesse assunto.A solução mais simples é desabilitar totalmente o índice de objetos ativos usando:

$Class::DBI::Weaken_Is_Available = 0;

Outras dicas

$obj->dbi_commit();pode ser o que você está procurando se tiver transações incompletas.No entanto, este não é o caso muito provável, uma vez que tende a concluir quaisquer transações remanescentes automaticamente após a destruição.

Quando você faz isso:

Music::Artist->purge_object_index_every(2000);

Você está dizendo para examinar o cache de objetos a cada 2.000 carregamentos de objetos e remover quaisquer referências inativas para conservar o uso da memória.Eu não acho que é isso que você quer.

Além disso,

Music::DBI->clear_object_index();

Remove todos os objetos do índice de objetos ativos.Não sei como isso ajudaria;na verdade, não é liberá-los para o disco.

Parece que o que você está tentando fazer deve funcionar perfeitamente do jeito que está, mas pode haver um problema com seu SQL ou em outro lugar que esteja impedindo o INSERT ou UPDATE de funcionar.Você está verificando erros para cada consulta ao banco de dados, como sugere o perldoc?Talvez você possa começar por aí ou nos logs de erros do seu banco de dados, observando as consultas para ver por que elas não estão sendo concluídas ou se chegam.

Espero que isto ajude!

Eu usei remove_from_object_index com sucesso no passado, de modo que quando uma página que modifica o banco de dados é chamada, ela sempre redefine explicitamente esse objeto no cache como parte da página de confirmação.

Devo observar que Class::DBI está obsoleto e você deve portar seu código para DBIX::Classe em vez de.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top