문제

저는 현재 기존 데이터베이스 구조에 대한 Class::DBI의 대규모 구현을 작업 중이며 Class::DBI에서 캐시를 지우는 데 문제가 있습니다.이것은 mod_perl 구현이므로 클래스 인스턴스는 액세스되는 시점 사이에 상당히 오래될 수 있습니다.매뉴얼 페이지에서 두 가지 옵션을 찾았습니다.

Music::DBI->clear_object_index();

그리고:

Music::Artist->purge_object_index_every(2000);

이제 DESTROY 메서드에clear_object_index()를 추가하면 실행되는 것처럼 보이지만 실제로 캐시를 비우지는 않습니다.데이터베이스를 수동으로 변경하고 요청을 다시 실행할 수 있지만 여전히 이전 버전입니다.purge_object_index_every는 n번 요청마다 인덱스를 삭제한다고 말합니다.이것을 "1"또는 "0"으로 설정하면 인덱스가 지워지는 것 같습니다 ...때때로.나는 그 둘 중 하나가 작동할 것으로 기대하지만 어떤 이유로 매번 작동하지는 않습니다.5번 중 1번 정도입니다.

이 문제를 해결하기 위한 제안이 있으십니까?

도움이 되었습니까?

해결책

"일반적인 문제" 페이지의 클래스::DBI 위키 가지고있다 부분 이 주제에 대해.가장 간단한 해결책은 다음을 사용하여 라이브 객체 인덱스를 완전히 비활성화하는 것입니다.

$Class::DBI::Weaken_Is_Available = 0;

다른 팁

$obj->dbi_commit();완료되지 않은 거래가 있는 경우 찾고 있는 것일 수 있습니다.그러나 파기 시 느린 트랜잭션을 자동으로 완료하는 경향이 있기 때문에 그럴 가능성은 거의 없습니다.

이 작업을 수행할 때:

Music::Artist->purge_object_index_every(2000);

2000개의 개체가 로드될 때마다 개체 캐시를 검사하고 메모리 사용을 절약하기 위해 죽은 참조를 제거하도록 지시합니다.나는 그것이 당신이 원하는 것이라고 전혀 생각하지 않습니다.

뿐만 아니라,

Music::DBI->clear_object_index();

라이브 개체 인덱스에서 모든 개체를 제거합니다.이것이 어떻게 도움이 될지는 모르겠습니다.실제로 디스크에 플러시하는 것이 아닙니다.

당신이 하려는 일이 지금까지의 방식대로 잘 작동할 것 같지만, SQL이나 다른 곳에 문제가 있어서 INSERT나 UPDATE가 작동하지 않을 수도 있습니다.Perldoc에서 제안한 대로 각 데이터베이스 쿼리에 대한 오류 검사를 수행하고 있습니까?아마도 거기나 데이터베이스 오류 로그에서 시작하여 쿼리가 완료되지 않는 이유나 쿼리가 도착하는지 확인하기 위해 쿼리를 관찰할 수 있습니다.

도움이 되었기를 바랍니다!

나는 과거에 Remove_from_object_index를 성공적으로 사용했기 때문에 데이터베이스를 수정하는 페이지가 호출될 때 항상 확인 페이지의 일부로 캐시에 있는 해당 개체를 명시적으로 재설정했습니다.

Class::DBI는 더 이상 사용되지 않으며 코드를 다음으로 포팅해야 합니다. DBIx::클래스 대신에.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top