Веб-сервис WSDL возвращает старые данные из базы данных, даже если я обновил базу данных - PullRequest
1 голос
/ 17 февраля 2012

У меня есть веб-сервис, который работает и генерирует файл WSDL на основе данных, хранящихся в базе данных.

Когда я обновляю некоторые столбцы в базе данных новыми данными, а затем перезагружаю WSDL, старое значение по-прежнему возвращается из веб-службы.

Должен ли я включить что-то на EntityManager (в коде java) или что-то еще?

Ответы [ 2 ]

2 голосов
/ 17 февраля 2012

Прежде всего, вы действительно имеете в виду WSDL ? Я с трудом представляю себе систему, которая изменяет WSDL (контракт веб-сервиса, другими словами, описание интерфейса) при изменении в базе данных (хотя, конечно, это возможно).

При этом я предполагаю, что меняется ответ веб-службы. Похоже, вы используете JPA. Большинство провайдеров JPA добавляют некоторый уровень кэширования. Например. в Hibernate есть кеш L1, кеш L2 и кеш запросов. Если вы изменяете базу данных вручную, JPA не знает об этих изменениях и по-прежнему обслуживает старые данные.

Укажите, какого провайдера JPA вы используете, обычно есть способ очистки кэшей вручную (в провайдере или в библиотеке кэширования).

ОБНОВЛЕНИЕ: Оказалось, что вы используете EclipseLink. Пожалуйста, попробуйте очистить кэш с помощью следующего кода:

org.eclipse.persistence.jpa.JpaHelper.
  getEntityManager(entityManager).
  getEntityManagerFactory().
  getCache().
  evictAll();

Теперь самое сложное - когда его вызывать? Лучшее решение - выполнять эту функцию каждый раз, когда вы изменяете базу данных напрямую. Вы упомянули, что PHP-скрипты напрямую изменяют базу данных. Вызов Java из PHP может быть достигнут, например, с JMX и Jolokia или вы можете предоставить еще один веб-сервис SOAP.

Другим решением является периодическая очистка кэша, если вы можете какое-то время жить с устаревшими данными. С другой стороны, очистка кэша при каждом обновлении может быть причиной снижения производительности.

0 голосов
/ 18 февраля 2012

Также можно отключить кэширование EclipseLink, добавив следующую строку в ваш файл persistence.xml:

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