2011-01-06 3 views
0

나는 JBoss 5.1.0 GA를 Hibernate와 함께 사용하고 있으며 이제 두 번째 레벨 캐시를 활성화하려고합니다. 내 Hibernate 설정에 다음 속성을 추가했다.동시 생성 이벤트

<property name="hibernate.cache.use_query_cache" value="true"/> 
<property name="hibernate.cache.use_second_level_cache" value="true"/> 
<property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.jbc2.MultiplexedJBossCacheRegionFactory"/> 
<property name="hibernate.cache.jbc2.query.localonly" value="true"/> 
<property name="hibernate.cache.region_prefix" value="my_prefix" /> 

그리고 나는 다음과 같이 자주 변경하는 기대 실체 주석했습니다

@Cache(usage=CacheConcurrencyStrategy.TRANSACTIONAL) 

이는 documentation에 대한 이해를 기반으로합니다.

응용 프로그램이 무섭게 보이는 메시지 (예 : 로그 스트림에서 WARN 또는 ERROR 메시지)없이 성공적으로 배포합니다. 짧은 시간 동안 (나는 이것을 볼 때 Hibernate 통계를 사용하고있다.) 캐싱을 보았지만 잠시 후에 (심지어 원격 액세스가없는 단일 사용자로 로그온했을 때조차도) 양식의 스택 추적을 얻는다.

"거래 새롭게 MyClass의 작성을 시도.이 거래 이 시작된 이후 이미 다른 (아마도 원격) 거래. 우리는 동시 생성 이벤트가에 의해 생성 을하고있다"

거대한 스택 트레이스를 따라 가면 결국 이름을 거슬러 올라갑니다. 내가 만든 쿼리는 다음 형식을 갖습니다.

SELECT x FROM X WHERE x.deleted = false 

명명 된 쿼리에는 캐싱에 대한 추가 주석이 없습니다.

이 문제를 해결하는 방법에 대한 조언은 크게 감사하겠습니다. 첫째

+1

확실하지는 않지만 캐시의 잠금 및 격리 설정을 사용하려고합니다. – Stas

+0

이것은 도움이되었습니다 - mvcc-entity가 아닌 pessimistic-entity를 사용하여 모든 것이 잘되었습니다. –

답변

1

몇 가지 질문 :이 예외는 응용 프로그램에

  1. 를 전파되어 있습니까? 내 말은, 당신이 이것에 영향을 받았나요, 아니면 그냥 로그에있는 메시지에 관심이 있습니까?
  2. 모든 엔티티에 거래 전략이 추가 되었습니까?
  3. 쿼리가 다른 클래스의 열심히 가져온 개체를 검색합니까?

난 당신이 지금 할 수있는 가장 좋은 방법은 캐시 작업에 대한 DEBUG (또는 어쩌면 TRACE) 로깅 수 있도록하는 것입니다 말할 것이다 : 이것은 Hibernate는 일을 정확히 무엇을 말할 것이다 log4j.logger.org.hibernate.cache=debug을. I 용의자 Hibernate는 캐시에 객체를 넣으려고 시도하고 같은 세션에서 같은 객체를 보았을 때 (다시 한번 다른 객체의 트리의 일부로) 그것을 다시 시도한다. 몇 시간 전 Query Cache에 대한 타임 스탬프 문제가 발생했으며 여기에서도 같은 문제가 발생할 수 있습니다. 예를 들어 :

 
Object A#1 
-- Object B#1 

Object A#2 
-- Object B#1 

그러나 다시,이 솔루션은 문제가 어떻게 될지 모르고 무엇인지 예측하기 조금 어렵다. 그리고 나는 Hibernate의 로그 만이 문제가 실제로 무엇인지 말할 수 있을지 두려워합니다.

추신 : 이것은 설명으로 게시하기위한 것이지만, 너무 길었습니다.

+0

의견 주셔서 감사합니다. 귀하의 질문에 대한 답변입니다. 1) 이것은 응용 프로그램에 전달되며 몇 가지 문제점을 야기합니다. 2) 모든 캐시 가능 엔티티는 같은 방식으로 주석을 달았지만, 주석 처리 된 엔티티의 일부에 지나지 않습니다. 3) 클래스에 다른 캐시 된 객체를 가져올 일부 @ManyToOne 관계가 있습니다. 이 문제로 인해 로깅 변경 사항을 제안하고 어떤 일이 벌어지는 지 알 수 있을지 의심 스럽습니다. 감사! –

+0

mvcc-entity 대신 pessimistic-entity를 사용하도록 캐시 구성을 변경했으며 오류 메시지가 사라졌습니다. 측정 결과에 따르면 캐싱은 개선 된 것이므로 잠시 동안은 그대로 두겠습니다. 최대 절전 모드 캐싱 디버깅 추적에 대한 힌트가 올바른 방향으로 나를 가리키는 것처럼이 대답을 받아 들일 것입니다. –

0

CacheConcurrencyStrategy.NONSTRICT_READ_WRITE를 사용해 보셨습니까?나는 여러 번 문서를 읽었고 정확히 무엇을 선택해야할지 모르지만 내 프로젝트에서는 제대로 작동하는 것 같다. CacheConcurrencyStrategy.TRANSACTIONAL이 너무 안전하고 특정 상황에서 캐시 성능을 피하는 것 같습니다.

+0

CacheConcurrencyStrategy.NONSTRICT_READ_WRITE는 JBoss 캐시에서 지원되지 않는 것으로 보입니다 (적어도이 문서에 따라 - http : //docs.jboss. org/hibernate/core/3.3/reference/ko/html/performance.html # performance-cache). 엔티티가 수정 될 가능성이 희박하기 때문에 읽기 전용을 사용할 수 없습니다. –