【发布时间】:2012-03-08 15:51:53
【问题描述】:
我有一个正在运行的 Web 服务,它根据存储在数据库中的数据生成一个 WSDL 文件。
当我用新数据更新数据库中的某些列,然后重新加载 WSDL 时,旧值仍会从 Web 服务返回。
我是否必须在 EntityManager(在 java 代码中)上启用某些东西?
【问题讨论】:
标签: java php database jpa eclipselink
我有一个正在运行的 Web 服务,它根据存储在数据库中的数据生成一个 WSDL 文件。
当我用新数据更新数据库中的某些列,然后重新加载 WSDL 时,旧值仍会从 Web 服务返回。
我是否必须在 EntityManager(在 java 代码中)上启用某些东西?
【问题讨论】:
标签: java php database jpa eclipselink
还可以通过在您的 persistence.xml 中添加以下行来禁用 EclipseLink 的缓存行为:
<property name="eclipselink.cache.type.default" value="NONE" />
【讨论】:
首先,您真的是指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 服务。
另一个解决方案是定期清除缓存,如果您可以忍受一段时间的陈旧数据。另一方面,在每次更新时清除缓存可能会影响性能。
【讨论】: