2009-03-22 4 views
1

최대 절전 모드를 사용하여 MYSQL DB에 액세스하는 struts 응용 프로그램이 있습니다. DB를 변경하는 많은 페이지가 있습니다. 이러한 변경 사항은 정상적으로 처리되며 데이터는 DB에서 업데이트됩니다. 그러나이 업데이트 된 정보를 표시해야하는 페이지를 탐색 할 때 페이지가 자주 표시되지 않고 몇 페이지를 새로 고친 후에도 여전히 표시되지 않습니다. 결국 그것은 나타날 것입니다. 나는 이것이 최대 절전 캐싱 데이터와 관련이 있다고 가정하고 있지만 데이터가 최신 상태인지 어떻게 확인할 수 있습니까? 나는 그것이 모두 최대 절전 모드 세션을 거치면서 변경 사항을 선택할 것이라고 생각했습니다. 내가 업데이트를 수행하는 사용하고 코드는 다음과 같습니다 Hibernate가 변경을 반영하지 않음

hSession = HibernateUtil.getSessionFactory().getCurrentSession(); 
    Transaction tx = hSession.getTransaction(); 
    tx.begin(); 
    hSession.update(user) ; 

그런 다음 밖으로 다시 사용자를 끌어 :

org.hibernate.Session hSession = HibernateUtil.getSessionFactory() 
.getCurrentSession(); 
Transaction tx = hSession.beginTransaction(); 
User u= (User) hSession.load(User.class, userID); 

답변

3

너무 작은 값으로 캐시 항목을 수동으로 무효화 할 수 있습니다. 정보는 실제로 답변을 제공합니다. 그러나 확인할 사항 :

  • 거래를 사용 중입니다. 당신이 그들을 저주하고 있습니까? 어쩌면 코드가 아직 변경되지 않았거나 (또는 ​​읽기 코드가 이전 상태를 사용하는 다른 트랜잭션에 있기 때문에) 코드가 변경 사항을 볼 수 없을 수도 있습니다.

  • 캐시 문제 일 수 있습니다. 확인하려면 DB (Session.flush())를 변경할 때마다 캐시를 ​​명시 적으로 플러시 할 수 있습니다. 이렇게하면 성능이 저하되지만 문제의 범위를 좁히는 데 도움이 될 수 있습니다.

+0

예, 위의 설정에서 트랜잭션을 명시 적으로 커미트해야합니다. – javashlook

1

그것은 아마도 second level (session factory) hibernate cache의 결과이다.

캐싱 투명하고 당신이 준 코드와 함께 잘 작동하지만, 문제는 때 일반적으로 발생한다 : 당신은 기계의 클러스터를 실행하는

  1. 와 캐시가 각을 무효화 할 수있는 방법이 없습니다 other configured
  2. 최대 절전 모드 외부에서 데이터베이스를 업데이트하고 있습니다.

두 번째 수준의 캐시 문제인지 확인하는 가장 쉬운 방법은 최대 절전 모드 구성에서 캐시를 완전히 사용하지 않도록 설정하는 것입니다. 캐시 인 경우 클러스터가 자동으로 캐시를 관리 할 수 ​​있도록 클러스터를 구성하거나 외부 하이버 네이트 업데이트에 문제가있는 경우 hibernate api

+0

이것은 단일 컴퓨터 (dev 컴퓨터)이며 유일한 변경 사항은 최대 절전 모드이지만, 캐시를 비활성화하면 어떤 일이 발생하는지 알 수 있습니다! –

+0

하나의 머신에서 여러 개의 SessionFactory 오브젝트가 생성 된 경우 2 차 레벨 캐시 문제가 계속 표시 될 수 있습니다. 각 세션 팩토리는 독립적이며 별도의 물리적 시스템에있는 것처럼 작동합니다. 다른 웹 응용 프로그램이 있거나 코드에서 해당 웹 응용 프로그램을 만들면 여러 웹 응용 프로그램이있을 수 있습니다. –