2009-12-11 48 views
2

我正在编程一个JSP/JSF Web应用程序并且当前使用的是Hibernate(和MySQL)库。当我使用正在运行的应用程序更新数据时,一切正常。休眠:必须重新启动Java应用程序才能实现数据

例子:我修改客户信息

虽然如果我手动更改数据或手动添加在MySQL的条目,则变化不会对我的申请方有效。

问题:每一次,我都要重新加载应用程序。

任何人都可以理解我的问题并找到一个快速解决方案?

回答

0

可能Hiberante缓存已启用,需要重新加载行/对象。

或者您应该通过Hibernate更新/插入数据。

+0

那么问题是我们有一个本地应用程序和一个Web应用程序使用相同的数据库。如果我使用软件应用程序对数据库进行了更改,则仅当页面重新加载时才能在Web应用程序内更新数据。 (整个应用程序必须重新加载。)我没有发现任何配置,我做了abot休眠缓存。 – wiooz 2009-12-11 20:00:50

1

您是否在您的Web应用程序中使用了second level cache?如果是这样,你的选择是:

  1. 使用集群缓存(见上面链接选项)和远程当你的本地应用程序,使对数据库的修改使它无效。
  2. 在您的Web应用程序中公开一个必须调用的API(Web服务或甚至基本URL)(手动或通过您的“本地”应用程序)以使缓存失效。基本上,与#1相同,但更多的工作:-)所以只能在#1不适用的情况下使用。

如果你不使用二级缓存,但遇到了你所描述的问题,这意味着你持有到您的会话的时间太长了。会议应 generally be short-lived

+0

谢谢你的信息。我想我没有在这个应用程序中使用任何缓存。例如,当我显示不同的付款时,它应该只在我重新加载页面时重新加载数据... Session session = SessionFactoryUtil.getInstance()。openSession(); (“SELECT * FROM factures INNER JOIN paiements ON paiements.id_facture = factures.id_facture WHERE factures.id_membre =”+ this.membre.getIdMembre()); query.addEntity(Paiements.class).addEntity(Factures.class); List paiements = query.list(); session.close(); – wiooz 2009-12-11 20:26:05

+0

您是否在等待您的页面(会话等)中查询结果?启用hibernate SQL调试(http://docs.jboss.org/hibernate/stable/core/reference/en/html/session-configuration.html#configuration-optional),并检查每次点击页面时确实执行了查询。 – ChssPly76 2009-12-11 20:40:28

0

我不确定你是如何配置你的Hibernate会话的,但是一些配置要求你除了关闭会话外还要刷新会话(例如,能够从底层JDBC连接断开到DB的会话)。因此,在一个评论回复,你说你结束工作,session.close(); - 尝试这样做:

session.flush(); 
session.close(); 

代替,看看是否可以修正你所看到的。

否则,我会检查您是否确实没有使用二级缓存......在您的休眠配置中明确禁用它,将hibernate.cache.provider_class设置为org.hibernate.cache.NoCacheProvider

+0

OP运行查询;没有什么可刷新的。以同样的精神,查询必须明确标记为可缓存;如果没有配置二级缓存提供程序,则不会有所作为。 – ChssPly76 2009-12-11 21:21:59

0

阅读其他的答案,这真的奇怪的意见。 您是否可以确认每次调用页面时至少关闭一次Hibernate会话?你确定修改数据库的其他应用程序确实提交了更改吗?

相关问题