2010-06-24 20 views
7

2. düzey önbellekimiz için MySQL, Hibernate (3.5.1-Final) ve EHcache (1.2.3) kullanan bir Java uygulamasına sahibiz.Yüksek düzeyde eşzamanlı işlemler içeren hazırda 2. düzey önbellek ObjectNotFoundException

Bizim hibernate.properties yalıtım düzeyi eşzamanlı işlemlerin sayısının yüksek Altında

# 2-Read committed isolation 
hibernate.connection.isolation=2 

2, biz bir sorunu görüyorsanız =-Oku kaydedilmiş yalıtım nerede bir atacağım yüklenen bazı koleksiyonları (DB dernekler) ObjectNotFoundException ve 2. düzey önbellek bu koleksiyonun eski bir kopyasını döndürüyor görünür.

Bu koleksiyona (yalnızca okuma) erişen ve yalnızca öğeyi ekleyeceğiniz/silecek birkaç farklı işlem türüne sahibiz.

Tek bir işlem yükü veya hatta ılımlı işlem yükü (10 - 20 eşzamanlı bağlantı) altında bu sorunu görmüyoruz.

Örneğin bir karakter varlık var: session.delete onlar içerdiği konum koleksiyonundan bunları kaldırmayı ve arayarak varlıkları silerken Biz düzgün nesne grafiği sürdürmek vardır

@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); 

Biz Set öğeleri değiştirmeyi denedim; CacheConcurrencyStrategy dan:

@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) 
private Set<CharacterItem> items; 

@Cache(usage = CacheConcurrencyStrategy.READ_WRITE) 
private Set<CharacterItem> items; 

için hiçbir şansla.

Veritabanı kilitlerini kullanmıyoruz, çakışan işlemleri yakalamak ve yeniden denemek için optimistic concurrency control kullanıyoruz. yeterli bağlam olarak görünmüyor olsa da (ObjectNotFoundException yakalamak ve akıllıca koleksiyonunu tahliye etmeye

  1. deneyin:

    bu noktada görebilirsiniz sadece 2 çözümleri etmektir istisna)

  2. ObjectNotFoundException atmak yok sayıp olmaz öğeler koleksiyonu, üzerinde @NotFound(action=NotFoundAction.IGNORE) ek açıklamasını kullanın (ama bu 2 düzey ca ile nasıl çalıştığı konusunda biz endişeleriniz che ve uygun verilere bakarak emin olun).

Ben önbellekten o nesneyi tahliye ve toplama yeniden girişiminde bir @NotFound (action = NotFoundAction.EVICT_2ND_LEVEL_CACHE_RELOAD) olsaydı.

Ayrıca FetchyType'ı LAZY'den EAGER'e değiştirmeyi deneyebiliriz, ancak sorunu anlamaya çalışmak ve bu verilerdeki işlemlerin yüksek eşzamanlı olarak tutarlı olmasını sağlayacak en iyi çözümü seçmeyi denemek istiyorum.

+0

Bunu hiç doğru bir şekilde çözdünüz mü? Aynı problemim var. – cherouvim

cevap

1

Belki session.delete yerine session.evict(characterItem)'u denemelisiniz?

İlgili konular