2014-06-13 11 views
2

Eclipse IDE, EclipseLink, JPA 및 MySQL을 사용하여 응용 프로그램을 개발 중입니다. 앱을 처음 실행하는 동안 표의 콘텐츠를 삭제해야합니다. 그러나 삭제 후 응용 프로그램은 새 연결을 만들지 만 빈 테이블에서 이전 데이터를 읽습니다. 초기 작업은 작업이 수행 될 때마다 new EntityManager을 작성하는 것이 었습니다.JPA 캐시가 유효하지 않음

private EntityManager entityManager; 

    public FacadeFactory() { 
     entityManager = DBConnection.connect(); 
    } 

JPA 캐싱을 비활성화 한 후에 문제가 해결되었습니다.

성능 문제로 인해 EntityManager은 데이터베이스에 단 하나의 연결을 열기 위해 싱글 톤으로 변경되었습니다.

private static FacadeFactory instance; 
    private EntityManager entityManager; 

    private FacadeFactory() { 
     entityManager = DBConnection.connect(); 
    } 

    public static FacadeFactory getInstance(){ 
     if(instance == null){ 
      instance = new FacadeFactory(); 
     } 
     return instance; 
    } 

이제 캐시가 여전히 비활성화 된 경우에도 이전과 동일한 문제가 발생합니다. persistence.xml 및 코드에서 모두 캐싱을 사용하지 않으려 고했지만 그 중 아무 것도 작동하지 않습니다.

<property name="eclipselink.cache.shared.default" value="false"/> 
entityManager.getEntityManagerFactory().getCache().evictAll(); 

아무도 도와 줄 수 있습니까?

+0

필요할 때 새로운 EntityManager를 사용할 때 어떤 성능 문제가 있었습니까? 가벼운 무게를 사용해야하는데, 어쨌든 비활성화하려는 추가 캐싱 만이 표시되어야합니다. – Chris

+0

@ 크리스, 알았어. d 매번 새로운 EntityManager를 생성 할 때 프로그램이 약간 느리게 실행되었습니다. – sebi

답변

0

entityManager.getEntityManagerFactory(). getCache(). evictAll(); eclipselink.cache.shared.default "value ="false "또한 공유 캐시에 영향을 미치지 만 공유 캐시는 두 번째 레벨 캐시라고도합니다. 첫 번째 캐시는 EntityManager 자체에서 추적하는 데 사용되는 캐시입니다 모든 항목에 대해 하나의 EntityManager를 사용하기 때문에 모든 것이 첫 번째 레벨 캐시에 저장됩니다.

필요에 따라 새 EntityManager를 만들거나 때때로 캐시를 지우기 위해 em.clear()를 호출 할 수 있습니다. EntityManager에서 - 엔티티 분리하기

+0

고마워요 @ 크리스! find() 또는 findAll()을 호출 할 때마다 em.refresh (entity)를 호출하여 문제를 해결했습니다. 어느 것이 더 낫다고 생각하십니까? – sebi

+0

대신에 때때로 자원을 해제하기 위해 명확하게 호출 할 수 있도록 EntityManager를 경계 설정하는 작업을 수행합니다. 각 또는 모든 찾기 또는 쿼리에서 새로 고침 또는 새로 고침을 호출하면 성능 문제가 발생할 수 있지만 앱을 사용하는 방법에 따라 다릅니다. – Chris