2012-03-29 8 views
0

최대 절전 모드로 구동되는 Java SE 응용 프로그램을 빌드 중입니다. 주로 많은 Java SE 인스턴스가 실행되며 많은 Hibernate Session 팩토리가 있습니다. 한 클라이언트 컴퓨터가 데이터 소스에 개체를 삽입하면 다른 클라이언트는 캐시를 지우지 않으면 해당 클라이언트를 볼 수 없습니다. 이 경우에 사용할 수있는 더 나은 메커니즘이 있습니까? 다음은 캐시 지우기 방법입니다.Java SE 응용 프로그램에서 Hibernate 동시성 문제

public static void clearCache() { 
     HibernateHelper.beginTranscation(); 
     HibernateHelper.getCurrentSession().clear(); 
     HibernateHelper.getSessionFactory().evictQueries(); 
     try { 
      Map<String, ClassMetadata> classesMetadata = HibernateHelper 
        .getSessionFactory().getAllClassMetadata(); 
      for (String entityName : classesMetadata.keySet()) { 
       HibernateHelper.getSessionFactory().evictEntity(entityName); 
      } 
     } catch (Exception e) { 
     } 
     HibernateHelper.commit(); 
    } 

제 2 수준 캐시 (Memcache)와 쿼리 캐시도 사용하고 있습니다.

+0

2 차 캐시 (L2) 캐시를 사용하고 있습니까? – Santosh

+0

네 ... Memcache를 사용하고 있습니다. – Chan

+0

은 각각의 클라이언트가 동일한 memcache 서버를 사용하고 있거나 개별 memcache를 가지고 있습니까? – Santosh

답변

1

L2 캐시를 사용하는 방법으로 인해 응용 프로그램이 여러 세션 팩토리를 사용하므로 데이터 불일치가 이므로이고, distributed cache이 필요합니다. 시스템 또는 당신이 (memcached client의 도움으로) 클라이언트의 각이 사용할 중앙 memcache에 서버를 가질 수

enter image description here

또는

보이는 방법은 다음과

이다. (모든 사용자가 사용하는 한 memcached를)

한 사용자/세션 팩토리 저지른 변경 캐시를 활용하기위한 다른 사용자/세션 공장에 볼 수 있어야한다는 것이다 기본적인 요구 사항. 주어진 코드 샘플은 트랜잭션이 커밋 될 때마다 L2 캐시를 정리하므로 도움이되지 않습니다. 이것은 L2 캐시 또는 세션 캐시에 의해 수행됩니다.

나의 제안

  1. 전혀 따라서 어떤 지역 memcache에 L2 캐시를 사용하지 마십시오 것입니다. 모든 트랜잭션 후에 캐시를 정리할 때 어쨌든이를 활용하지는 않습니다.
  2. L2 캐시가 필요하다면 분산 캐시를 사용하거나 (약간 복잡함) 모든 캐시 캐시에 하나의 memcached 서버를 사용하십시오.

this link도 확인하십시오.

관련 문제