我有一个Web应用程序,它从数据库中提取数据然后显示它。现在我遇到的问题是每小时我都要对数据库中的数据进行更新;这是由一个单独的应用程序完成的,一切正常。但是,一旦发生这种情况并且用户刷新其网页,则不会显示新数据。
我希望这是有道理的。
我会从应用中提供一些代码,以便您更好地了解它。
我的网络应用程序是使用java编写的netbeans,我有一个持久性单元,它将类映射到数据库中的表。我正在使用wicket将我的组件添加到我的HTML中。
// Java Wicket代码
ApplicationSettings apset = new ApplicationSettingsDAO().getApplicationSettings();
this.add(new Label("lblGameTime", "" + apset.getGameTimeDays()));
// Wicket 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只是一个类。
//每小时代码在另一个有效的应用程序中运行并更新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 是正确的,因为页面会再次从db获取数据,因为它会调用 java wicket代码以上。但价值不会改变。页面上显示的值是更新前的旧陈旧值。无论发生多少次更新,此值仍然是旧值。但是,如果我在tomcat服务器中重新部署或重新启动模块,则该值在该时刻是正确的。
我错过了什么,这是一个很小的问题,答案似乎暗指我。
该值似乎存储在内存中,直到重新部署服务器或其他东西。我不知道很多关于java的内部工作原理。
好的,我希望我提供足够的信息帮助我解决我的困境。
感谢您的帮助。
编辑:持久性库是TopLink Essentials
答案 0 :(得分:1)
听起来您使用的持久性机制正在缓存您的数据(您不会透露详细信息)。这不是Java的特性,而是特定持久性框架的特征,例如,冬眠。
如果您让我们更多地了解您的持久性提供程序,我们可能会提供更具体的建议。
答案 1 :(得分:1)
您可以使用persistence.xml属性
在TopLink中禁用共享缓存
或者按实体禁用它,或使用刷新或缓存失效。
EclipseLink提供了更多缓存选项并实现了JPA 2.0缓存API。
http://wiki.eclipse.org/EclipseLink/FAQ/How_to_disable_the_shared_cache%3F