我有一个正在运行的Web服务,并根据存储在数据库中的数据生成WSDL文件。
当我使用新数据更新数据库中的某些列然后重新加载WSDL时,仍然会从Web服务返回旧值。
我是否必须在EntityManager
(在java代码中)启用某些内容?
答案 0 :(得分: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服务。
另一种解决方案是定期清除缓存,如果您可以暂时使用陈旧数据。另一方面,在每次更新时清除缓存可能是性能杀手。
答案 1 :(得分:0)
还可以通过在persistence.xml中添加以下行来禁用EclipseLink的缓存行为:
<property name="eclipselink.cache.type.default" value="NONE" />