我有一個正在運行的Web服務,並基於存儲在數據庫上的數據生成WSDL文件。即使我已更新數據庫,WSDL Web服務也會返回來自數據庫的舊數據
當我使用新數據更新數據庫中的某些列,然後重新加載WSDL時,舊值仍然從Web服務返回。
是否必須在EntityManager
(在java代碼中)啓用某些東西?
我有一個正在運行的Web服務,並基於存儲在數據庫上的數據生成WSDL文件。即使我已更新數據庫,WSDL Web服務也會返回來自數據庫的舊數據
當我使用新數據更新數據庫中的某些列,然後重新加載WSDL時,舊值仍然從Web服務返回。
是否必須在EntityManager
(在java代碼中)啓用某些東西?
首先,你的意思是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服務。
另一種解決方案是定期清除緩存,如果您可以忍受過時的數據。另一方面,在每次更新時清除緩存可能是性能殺手。
也可以通過添加下面一行到你的persistence.xml禁用的EclipseLink的緩存行爲:
<property name="eclipselink.cache.type.default" value="NONE" />
是的,是beeing使用JPA(EclipseLink的JPA)。 WSDL文件本身不會在數據庫發生更改時發生更改,只是Web服務不會獲取新數據。數據庫正在手動更新(或者至少它不是更新數據庫的Web服務,它是更新它的PHP代碼)。 – Rox 2012-02-17 08:48:07
@Rox:JPA,但是提供商? Hibernater?的EclipseLink? OpenJPA的?您必須在您的PHP腳本中禁用緩存或強制緩存失效(棘手的Java-PHP集成)。幾乎肯定如果你重新啓動你的應用程序,它會返回新的數據。 – 2012-02-17 08:50:48
對不起,EclipseLink(編輯我以前的評論10秒前):-) – Rox 2012-02-17 08:50:59