2012-02-17 1 views
1

데이터베이스 서비스에 저장된 데이터를 기반으로 WSDL 파일을 생성하고 실행중인 웹 서비스가 있습니다.WSDL 웹 서비스는 데이터베이스를 업데이트하더라도 데이터베이스에서 이전 데이터를 반환합니다.

데이터베이스의 일부 열을 새 데이터로 업데이트 한 다음 WSDL을 다시로드하면 이전 값이 여전히 웹 서비스에서 반환됩니다.

EntityManager (java 코드에서) 또는 무언가에 설정해야합니까?

답변

2

우선, 실제로는 WSDL을 의미합니까? 물론 데이터베이스 변경시 WSDL (웹 서비스 계약, 즉 인터페이스 설명)을 변경하는 시스템을 상상할 수는 없습니다 (물론 가능하지만).

웹 서비스 응답이 변경된다고 가정합니다. JPA를 사용하고있는 것 같습니다. 대부분의 JPA 프로 바이더는 캐싱 레이어를 추가합니다. 예 : Hibernate에는 L1 캐시, L2 캐시 및 쿼리 캐시가 있습니다. 데이터베이스를 수동으로 수정하는 경우 JPA는 이러한 변경 사항에 대해 알지 못하고 오래된 데이터를 계속 제공합니다.

사용하는 JPA 프로 바이더를 지정하십시오. 일반적으로 캐시 (제공자 또는 캐싱 라이브러리)를 수동으로 플러시하는 방법이 있습니다.

업데이트 : EclipseLink를 사용하고있는 것으로 나타났습니다. 다음 코드를 사용하여 캐시를 삭제 해보세요 :

org.eclipse.persistence.jpa.JpaHelper. 
    getEntityManager(entityManager). 
    getEntityManagerFactory(). 
    getCache(). 
    evictAll(); 

이제 까다로운 부분 - 그것을 호출? 최상의 솔루션은 데이터베이스를 직접 수정할 때마다이 기능을 실행하는 것입니다. 데이터베이스를 직접 수정하는 PHP 스크립트라고 언급했습니다. 예를 들어 PHP에서 Java를 호출하면됩니다. JMX와 Jolokia 또는 다른 SOAP 웹 서비스를 노출 할 수 있습니다.

또 다른 솔루션은 잠시 오래된 데이터로 살아갈 수 있다면 주기적으로 캐시를 지우는 것입니다. 반면에 모든 업데이트에서 캐시를 지우는 것이 성능 저하 요인이 될 수 있습니다.

+0

예, JPA 사용에 beeing한다 (는 EclipseLink JPA). WSDL 파일 자체는 데이터베이스 변경시 변경되지 않으며 웹 서비스가 새 데이터를 가져 오지 않습니다. 데이터베이스가 수동으로 업데이트됩니다 (또는 적어도 데이터베이스를 업데이트하는 웹 서비스가 아니라 업데이트하는 PHP 코드입니다). – Rox

+0

@Rox : JPA,하지만 무슨 공급자? 하이버 네이터? EclipseLink? OpenJPA? PHP 스크립트에서 캐싱을 비활성화하거나 캐시 무효화를 강제해야합니다 (까다로운 Java-PHP 통합). 거의 확실하게 애플리케이션을 다시 시작하면 새로운 데이터가 반환됩니다. –

+0

죄송합니다, EclipseLink (내 이전에 편집 됨 10 초 전) :-) – Rox

0

당신의 persistence.xml에 다음 줄을 추가하여 EclipseLink가의 캐싱 동작을 비활성화 할 수도 있습니다 :

<property name="eclipselink.cache.type.default" value="NONE" /> 
관련 문제