2012-02-17 37 views

回答

2

首先,你的意思是WSDL?我很難想象一個系統會在數據庫發生變化時改變WSDL(Web服務契約,換句話說就是接口描述)(雖然這當然是可能的)。

這就是說,我認爲這是改變的Web服務響應。看起來你正在使用JPA。大多數JPA提供者添加一些緩存層。例如。在Hibernate中有L1緩存,L2和查詢緩存。如果您手動修改數據庫,JPA不瞭解這些更改並仍舊提供舊數據。

請指定您使用的是哪個JPA提供程序,通常有手動清除緩存(在提供程序或緩存庫中)的方法。

更新:原來你使用的是EclipseLink。請嘗試用下面的代碼清除緩存:

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

現在棘手的問題 - 時候打電話了嗎?最好的解決方案是每次直接修改數據庫時執行此功能。你提到它是直接修改數據庫的PHP腳本。從PHP調用Java可以實現,例如使用JMX和Jolokia,或者您可以公開另一個SOAP Web服務。

另一種解決方案是定期清除緩存,如果您可以忍受過時的數據。另一方面,在每次更新時清除緩存可能是性能殺手。

+0

是的,是beeing使用JPA(EclipseLink的JPA)。 WSDL文件本身不會在數據庫發生更改時發生更改,只是Web服務不會獲取新數據。數據庫正在手動更新(或者至少它不是更新數據庫的Web服務,它是更新它的PHP代碼)。 – Rox 2012-02-17 08:48:07

+0

@Rox:JPA,但是提供商? Hibernater?的EclipseLink? OpenJPA的?您必須在您的PHP腳本中禁用緩存或強制緩存失效(棘手的Java-PHP集成)。幾乎肯定如果你重新啓動你的應用程序,它會返回新的數據。 – 2012-02-17 08:50:48

+0

對不起,EclipseLink(編輯我以前的評論10秒前):-) – Rox 2012-02-17 08:50:59

0

也可以通過添加下面一行到你的persistence.xml禁用的EclipseLink的緩存行爲:

<property name="eclipselink.cache.type.default" value="NONE" /> 
相關問題