2 차 캐시에는 MySQL, Hibernate (3.5.1-Final) 및 EHcache (1.2.3)를 사용하는 Java 응용 프로그램이 있습니다.Hibernate 2 차 캐시 ObjectNotFoundException 높은 동시 트랜잭션 수
우리 hibernate.properties 격리 수준은 동시 트랜잭션의 높은 숫자에서
# 2-Read committed isolation
hibernate.connection.isolation=2
2, 우리는 문제를보고있다 = - 읽기 최선을 다하고 분리된다가 발생합니다로드 특정 컬렉션 (DB 협회) ObjectNotFoundException 및 2 수준 캐시가 해당 컬렉션의 이전 복사본을 반환하는 것으로 나타납니다.
우리는이 컬렉션 (독서에만 해당)에 액세스하는 많은 다른 유형의 트랜잭션과 항목에서 항목을 추가/삭제할 수있는 몇 가지 유형이 있습니다.
단일 트랜잭션로드 또는 중간 정도의 트랜잭션로드 (10-20 동시 연결)에서는이 문제가 표시되지 않습니다.
예를 들어 우리는 문자 엔티티가 : 것은 Session.delete을가 포함하고있는 컬렉션을 제거하고 호출하여 개체를 삭제할 때 우리는 제대로 개체 그래프를 유지하고
@Entity
@Table(name = "CHARACTERS")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class Character extends AbstractCharacter implements Serializable {
...
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
@OneToMany(mappedBy = "character", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private Set<CharacterItem> items;
을().
character.getItems().remove(characterItem);
session.delete(characterItem);
설정 항목을 변경해 보았습니다. CacheConcurrencyStrategy에서 :
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
private Set<CharacterItem> items;
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
private Set<CharacterItem> items;
으로 행운으로.
대신 데이터베이스 잠금을 사용하지 않고 optimistic concurrency control을 사용하여 충돌하는 트랜잭션을 포착하고 다시 시도합니다. 에 충분한 상황이있을 것 같지 않지만합니다 (ObjectNotFoundException을 잡아 지능적으로 컬렉션을 축출하려고
시도 :
우리가이 시점에서 볼 수있는 단지 2 솔루션이다 제외)
는 ObjectNotFoundException을 던져 무시하고하지 않습니다 항목 수집에 @NotFound(action=NotFoundAction.IGNORE) 주석을 사용합니다 (그러나 이것은 2 수준의 캘리포니아와 함께 작동하는 방법에 관해서는 우리는 문제가 che와 적절한 데이터를보고 있는지 확인하십시오).
나는 그것이 캐시에서 해당 개체를 퇴거 및 컬렉션을 다시 시도 할 것 @NotFound (액션 = NotFoundAction.EVICT_2ND_LEVEL_CACHE_RELOAD)이 있었다 바랍니다.
또한 FetchyType을 LAZY에서 EAGER로 변경해 볼 수도 있지만 문제를 이해하고 트랜잭션의 데이터가 높은 동시성에서 일관성있게 제공되도록 최선의 솔루션을 선택하려고합니다.
제대로 해결 했습니까? 나는 같은 문제를 가지고있다. – cherouvim