【问题标题】:WSDL web service returns old data from database even if I have updated the database即使我更新了数据库,WSDL Web 服务也会从数据库中返回旧数据
【发布时间】:2012-03-08 15:51:53
【问题描述】:

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

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

我是否必须在 EntityManager(在 java 代码中)上启用某些东西?

【问题讨论】:

    标签: java php database jpa eclipselink


    【解决方案1】:

    还可以通过在您的 persistence.xml 中添加以下行来禁用 EclipseLink 的缓存行为:

    <property name="eclipselink.cache.type.default" value="NONE" />
    

    【讨论】:

      【解决方案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 服务。

      另一个解决方案是定期清除缓存,如果您可以忍受一段时间的陈旧数据。另一方面,在每次更新时清除缓存可能会影响性能。

      【讨论】:

      • 是的,正在使用 JPA (EclipseLink JPA)。 WSDL 文件本身不会随着数据库的变化而变化,只是 Web 服务没有获取新数据。数据库正在手动更新(或者至少不是更新数据库的 Web 服务,而是更新它的 php 代码)。
      • @Rox:JPA,但是什么提供者?冬眠者?日食链接?开放JPA?您必须在 PHP 脚本中禁用缓存或强制缓存失效(棘手的 Java-PHP 集成)。几乎可以肯定,如果您重新启动应用程序,它将返回新数据。
      • 抱歉,EclipseLink(10 秒前编辑了我之前的评论):-)
      • 非常感谢!我在 get 方法(一种从数据库读取的方法)中添加了该行,它起作用了!现在每次我更新数据库时都会显示新数据。对从数据库获取数据的每种方法都这样做是一种好习惯吗?
      • @Rox:不,这不是一个好主意。它违背了缓存的目的,有效地减慢了应用程序的速度,因为缓存仍然由 JPA 更新,但从未真正使用过。您应该在每个原始数据库 update(通过 JPA 更新自动刷新缓存)或定期调用此方法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-20
      • 1970-01-01
      • 2022-10-20
      • 2018-02-13
      • 1970-01-01
      • 1970-01-01
      • 2019-03-31
      相关资源
      最近更新 更多