2009-01-23 3 views
0

웹 서비스로부터 객체들의 집합을 저장하기 위해 최대 절전 모드를 사용하고있다.Hibernate flush가 데이터베이스를 갱신하지 않는다.

개체가 수신 될 때마다 최대 절전 모드를 사용하여 개체를 저장합니다.

개체 수신은 트랜잭션으로 래핑되고 최종 개체를받은 후에 모든 개체가 데이터베이스에 나타납니다.

이제 데이터베이스를 저장할 때 각 개체를 데이터베이스에 표시하려고합니다. 나는 이것을 달성하려고 노력했다.

getHibernateTemplate().saveOrUpdate(foo); 

getHibernateTemplate().flush(); 
getHibernateTemplate().clear(); 

필자의 이해로는 최대 절전 모드 캐시를 제거하고 값을 데이터베이스에 써야한다.

학습 또는 지시 사항?

답변

1

브라이언에게 도움을 주셔서 감사합니다. 문제는 저장 호출을 래핑하는 다른 클래스의 for 루프로 밝혀졌습니다.

해결 방법은 for 루프를 제거하고 iterator으로 바꾸는 것입니다.

최대 절전 모드는 전체 for 루프에 대해 동일한 트랜잭션을 유지하고있었습니다. iterator을 사용하면, Hibernate는 새로운 트랜잭션을 시작한 것으로 보이고 다음 트랜잭션을 시작하기 전에 데이터베이스에 대한 커밋과 플러시를 수행한다.

1

아직 거래가 진행중인 경우 트랜잭션을 연 세션이나 연결 만 레코드를 볼 수 있습니다. 일부 데이터베이스에서는 더티/커밋되지 않은 읽기를 수행하면 다른 세션에서 볼 수 있습니다. 나는 플러시 후에 동일한 하이버 네이트 세션을 사용하여 select를 실행하여 데이터베이스에 실제로 있는지 확인하려고한다. 기본 키를 사용하여 쿼리하지 않거나 캐시에서 가져올 수 있습니다.

관련 문제