1

我有一个 Web 应用程序,它从数据库中提取数据然后显示它。现在我遇到的问题是每个小时我都想对数据库中的数据进行更新;这是由一个单独的应用程序完成的,这一切都很好。但是,一旦发生这种情况并且用户刷新了他们的网页,就不会显示新数据。

我希望这是有道理的。

我将从应用程序中提供一些代码,以便您更好地看到它。

我的 web 应用程序是使用 java 用 netbeans 编写的,我有一个持久性单元,它将类映射到数据库中的表。我正在使用 wicket 将我的组件添加到我的 html 中。

// Java 检票口代码

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

// 检票口 html 代码

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

// DAO 应用程序设置,它从 db 中获取设置对象并将其返回给上面的 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 只是类。

//每小时代码在另一个可以运行并更新数据库的应用程序中运行

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 wicket 代码。但是价值没有改变。页面上显示的值是更新前的旧值。无论发生多少次更新,此值仍然是旧值。但是,如果我在 tomcat 服务器中重新部署或重新启动模块,那么该值在那个时刻是正确的。

我错过了什么,这是一个小问题,答案似乎在暗示我。

该值似乎存储在内存中,直到重新部署服务器或其他东西。我不太了解java的内部工作原理来了解这一点。

好的,我希望我为某人提供了足够的信息来帮助我解决困境。

谢谢你的帮助。

编辑:持久性库是 TopLink Essentials

4

2 回答 2

1

听起来您的数据正在被您使用的持久性机制缓存(您没有透露详细信息)。这不是 Java 的特性,而是特定持久性框架(例如 Hibernate)的特性。

如果您让我们更多地了解您的持久性提供者,我们或许能够提供更具体的建议。

于 2011-01-23T20:56:51.153 回答
1

您可以使用 persistence.xml 属性禁用 TopLink 中的共享缓存,

或按实体禁用它,或使用刷新或缓存失效。

EclipseLink 提供了更多的缓存选项并实现了 JPA 2.0 缓存 API。

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

于 2011-02-08T14:35:20.317 回答