java - WSDL Web 服务从数据库返回旧数据,即使我已经更新了数据库

标签 java php database jpa eclipselink

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

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

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

最佳答案

首先,您真的是指 WSDL 吗?我很难想象一个系统会随着数据库的变化而改变 WSDL(Web 服务契约,换句话说是接口(interface)描述)(尽管这当然是可能的)。

话虽这么说,但我假设是 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 网络服务。

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

关于java - WSDL Web 服务从数据库返回旧数据,即使我已经更新了数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9325001/

相关文章:

java - java游戏开发中的窗口崩溃

php - 用 PHP 编写的语言解析器库

sql - 了解 SQL 中的 JOIN 的好方法或教程

sql - 将 varchar 列升级为 postgresql 中的枚举类型

java - 在 Java 中使用重载方法键入顺序

java - 容器中的 Servlet 实例

java - 如何将java数组的数据存储在硬盘中,以便以后使用?

php - 在 Mac 和 PC 上与 XAMPP 共享数据库

php - $_SERVER ['QUERY_STRING' ] 在 CodeIgniter 中不起作用

c# - NHibernate,简单问题,额外关联