即使我更新了数据库,WSDL Web服务也会从数据库返回旧数据

时间:2012-02-17 08:23:31

标签: java php database jpa eclipselink

我有一个正在运行的Web服务,并根据存储在数据库中的数据生成WSDL文件。

当我使用新数据更新数据库中的某些列然后重新加载WSDL时,仍然会从Web服务返回旧值。

我是否必须在EntityManager(在java代码中)启用某些内容?

2 个答案:

答案 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" />