2011-04-21 3 views
2

Hibernate가 때때로이 오류를 내게 던졌습니다 : org.hibernate.LazyInitializationException : 프록시를 초기화 할 수 없습니다 - Session이 없습니다.비정상적인 최대 절전 모드 세션?

이제 알았습니다. 즉, 내가 작업중인 엔티티가 세션에서 분리되어 지연로드 된 속성을 초기화 할 수 없음을 의미합니다. 그러나 문제는 100 % 재생산되지 않습니다. 새로 배포 할 때 절대로 발생하지 않으므로 감염된 서버를 다시 시작하여 문제를 해결합니다 (적어도 잠시 동안).

메모리 내 캐시를 사용할 수 있지만 캐싱이 어떻게이 문제를 일으키는 지연로드와 상호 작용할 수 있는지 알 수 없습니다. 더욱이, 우리는 왜 새로운 서버에서이 문제를 볼 수 없었을 것입니까?

+0

메모리 캐시의 최대 절전 모드 캐싱입니까? 타사 구현과 다른 점이 있습니까? – brainimus

+0

그것은 hibernate의 캐싱 인터페이스를 가진 ehcache이다. – Denise

+0

해결책을 찾았습니까? 난 당신이 설명한 것과 같은 문제가 있습니다 –

답변

0

이와 같은 LazyInitializationException은 일반적으로 오래된 오래된 최대 절전 세션의 개체를 사용할 때 throw됩니다. 예를 들어, 두 개의 요청이, 말 : o.foo.bar이 요청하면 그 요청 2는 새로운 세션을 얻을 수 있도록 코드를 수정해야 1에로드되지 않은 경우 LazyInitializationException이가 슬로우됩니다 여기

Object o = null; 

Request 1: 
Session s1 = ...; 
o = s1.get(MyObject.class, myId); 
s1.close(); 

Request 2: 
o.getFoo().getBar(); //May throw a lazyinit exception 

, 개체의 새로운 사본과 함께. 이런 종류의 문제는 추적하기가 까다로울 수 있습니다. 요청이 처리되지 않을 때 요청간에 보유하고있는 객체를 확인하십시오 (jvisualvm 또는 jprobe가 이익이 될 수 있음을 발견했습니다). 종종 문제의 원인은 분명하지 않습니다. 익명의 클래스는 예를 들어 참조가 유지되게 할 수 있습니다.

+0

요청은 웹 서비스 메서드에서 발생하므로 요청 간에는 아무 것도하지 않습니다. 각 요청은 독립적이어야하며 동일해야합니다. – Denise

+0

2 차 캐싱에 버그가있을 수 있습니다. 하지만, 나는 당신이 실수로 뭔가를 잡고 있거나 세션을 일찍 끝내는 앱이 있다고 생각할 것이다. 스택 트레이스는 어떤 모양입니까? – RMorrisey

+0

오, 내 앱 어딘가에있을 것으로 기대하고 있습니다! 그건 내가 고칠 수 있다는 뜻이다 ;-) – Denise