проблема с обновлением приложения новыми данными из базы данных - PullRequest
1 голос
/ 23 января 2011

У меня есть веб-приложение, которое извлекает данные из базы данных, а затем отображает их. Теперь у меня проблема в том, что каждый час я хочу обновлять данные в базе данных; это делается отдельным приложением, все отлично работает. Однако, как только это произошло, и пользователь обновил свою веб-страницу, новые данные не отображаются.

Надеюсь, это имеет смысл.

Я предоставлю код из приложения, чтобы вы лучше его видели.

Мое веб-приложение написано на NetBeans с использованием Java, и у меня есть модуль персистентности, который отображает классы в таблицы в базе данных. Я использую калитку, чтобы добавить свои компоненты в мой HTML.

// Код Java Wicket

ApplicationSettings apset = new ApplicationSettingsDAO().getApplicationSettings();    
this.add(new Label("lblGameTime", "" + apset.getGameTimeDays()));

// HTML-код калитки

Date : day <span wicket:id="lblGameTime">generated date</span>

// Настройки приложения DAO, которые получают объект настроек из БД и возвращают его в код Java Wicket выше

public ApplicationSettings getApplicationSettings() {

    ApplicationSettings settings;

    try {
     Query q = manager.createQuery("select s from ApplicationSettings s where s.setting = :setting");
     q.setParameter("setting", "setting");
     settings = (ApplicationSettings) q.getSingleResult();
  } catch (NoResultException e) {
     ApplicationSettings newSetting = new ApplicationSettings();
     return newSetting;
  }
     return settings;

}

// ApplicationSettings - это просто класс.

// Часовой код запускается в другом приложении, которое работает и обновляет db

Query query6 = manager.createQuery("select s from ApplicationSettings s where s.setting = :setting");
    query6.setParameter("setting", "setting");
    ApplicationSettings apset = (ApplicationSettings) query6.getSingleResult();
    apset.setGameTimeDays(apset.getGameTimeDays() + 1);
    save(apset);

Теперь, когда пользователь снова загружает страницу, я ожидаю, что gameTimeDays будет правильным, поскольку страница снова получит данные из базы данных, потому что она вызовет код калитки Java выше. НО значение не меняется. Значение, отображаемое на странице, является старым устаревшим значением перед обновлением. Независимо от того, сколько обновлений происходит, это значение остается старым. ОДНАКО, если я сделаю повторное развертывание или перезапущу модуль на сервере Tomcat, тогда значение будет правильным для этого момента времени.

Чего мне не хватает, это крошечная проблема, на которую, похоже, намекает ответ.

Значение сохраняется в памяти до повторного развертывания сервера или чего-то еще. Я не знаю много о внутренней работе Java, чтобы знать об этом.

Хорошо, я надеюсь, что предоставил достаточно информации, чтобы кто-нибудь помог мне с моей дилеммой.

Спасибо за любую помощь.

РЕДАКТИРОВАТЬ: постоянная библиотека TopLink Essentials

Ответы [ 2 ]

1 голос
/ 08 февраля 2011

Вы можете отключить общий кеш в TopLink, используя свойство persistence.xml,

Или отключите его для каждой сущности, или используйте обновление или аннулирование кэша.

EclipseLink предоставляет больше опций кэширования и реализует API кэширования JPA 2.0.

http://wiki.eclipse.org/EclipseLink/FAQ/How_to_disable_the_shared_cache%3F

1 голос
/ 23 января 2011

Похоже, что ваши данные кэшируются используемым вами механизмом сохранения (о котором вы не раскрываете детали). Это не особенность Java, а особенность таких сред персистентности, как, например, Hibernate.

Если вы дадите нам больше информации о вашем поставщике медицинских услуг, мы сможем дать более конкретный совет.

...