2011-08-11 2 views
0

SysCache2와 NHibernate 2.1.2.4를 사용하고 있습니다.NHibernate가 2 차 레벨 캐시가 업데이트되었을 때 엔티티를 제거하지 않는 이유는 무엇입니까?

아무리 노력해도 NHibernate는 엔티티의 이전 인스턴스를 계속로드합니다.

내 클래스가 캐시 가능 ReadWrite로 매핑되었습니다.

캐시 영역이 기본값입니다 (즉, 클래스 유형의 전체 이름).

트랜잭션 내에서 모든 작업을 수행하고 있습니다.

데이터베이스가 확실히 업데이트되고 있으며 ASP .NET의 캐시를 수동으로 지우면 문제가 사라집니다.

나는이처럼 간단한 업데이트를하고있는 중이 야 :

using(var transaction = NHSession.BeginTransaction()) 
{ 
    var foo = Session.Load<Foo>(_fooId); 

    foo.Name = "A new name"; 

    transaction.Commit(); 
} 

는 그럼 난 (응용 프로그램 내에서 다른 세션에서) 나중에 개체를 다시로드, 같은 :

using(var transaction = NHSession.BeginTransaction()) 
{ 
    var foo = Session.Load<Foo>(_fooId); 

    Response.Write(foo.Name); 

    transaction.Commit(); 
} 

.. 하지만 Foo의 이름은 여전히 ​​이전 이름이고, 방금 업데이트 한 새 이름이 아닙니다!

답변

1

저는이 작업을했습니다. 특정 이유로 두 개의 세션 팩토리가있었습니다. 저장 작업이 한 공장에서 발생하고 부하가 다른 공장에서 발생했다는 것을 알지 못했습니다.

1

모든 캐싱 관련 메시지를 기록하고 두 번째 트랜잭션이 커밋 될 때 캐시가 업데이트되는지 확인합니다. 다음은 캐싱 메시지를 기록하는 예제 log4net 설정입니다 ...

<logger name="NHibernate.Cache.ReadWriteCache" additivity="false"> 
    <level value="ALL"/> 
    <appender-ref ref="Console"/> 
</logger> 

+0

안녕하세요, 로그를 확인했습니다 및 엔터티가 업데이트 될 때 무효화되지 않습니다. – cbp

0

왜 Get 대신 Load를 사용합니까? 나는 이것이이 문제와 관련이 있다고 생각한다. This article은 차이점을 설명하지만 문제와 관련된 것은 아닙니다. 그래도 Get으로 전환하려고합니다.

+0

어떻게 그 문제가 될 수 있을지 이해하지 못합니다. Load는 프록시 만로드하는 반면 Get은 전체 엔터티를 즉시 검색합니다. 그 외에는 캐싱과 관련이없는 것으로 보입니다. – cbp

+0

첫 번째와 두 번째 레벨 캐시를 확인하십시오. 가장 큰 차이점은 Load는 null을 반환하지 않는다는 것입니다. 엔티티가 존재하지 않는 경우는 null를 돌려줍니다. 속성을로드 한 다음 ID와 다른 속성에 즉시 액세스하는 것은 의미가 없습니다. 내 생각 엔 실제 엔터티가 아닌 프록시를 업데이트하기 때문에 캐시 된 엔터티가 업데이트되지 않는다는 것입니다. –

+0

나는 그것이 의미가 있다고 생각하지 않는다. 프록시의 속성을 설정하자마자 프록시 자체를 프로 프리킥해야한다. – cbp

관련 문제