休眠:必须重新启动 Java 应用程序才能重新加载数据

Posted

技术标签:

【中文标题】休眠:必须重新启动 Java 应用程序才能重新加载数据【英文标题】:Hibernate : Java Application must be restarted for data to be realoaded 【发布时间】:2010-12-25 19:35:49 【问题描述】:

我正在编写一个 JSP/JSF Web 应用程序,目前正在使用 Hibernate(和 MySQL) 库。当我使用正在运行的应用程序更新数据时,一切正常。

示例:我修改了一个客户信息

虽然如果我手动更改数据或手动在 mysql 中添加条目,但更改不会在我的应用程序端生效。

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

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

【问题讨论】:

【参考方案1】:

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

    使用集群缓存(有关选项,请参见上面的链接)并在本地应用程序对数据库进行更改时远程使其无效。 在您的 Web 应用程序中公开一个 API(Web 服务甚至是基本 URL),您必须调用该 API(手动或通过“本地”应用程序)以使缓存无效。基本上,与 #1 相同,但需要更多工作 :-) 所以仅在 #1 不适用时使用。

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

【讨论】:

感谢您提供的信息。我想我没有在这个应用程序中使用任何缓存。例如,当我显示不同的付款时,它应该只在我重新加载页面时重新加载数据... Session session = SessionFactoryUtil.getInstance().openSession(); SQLQuery 查询 = session.createSQLQuery("SELECT * FROM fROM 内部联接 paiements ON paiements.id_facture = factures.id_facture WHERE factures.id_membre = " + this.membre.getIdMembre()); query.addEntity(Paiements.class).addEntity(Factures.class);列出付款 = query.list(); session.close(); 您是否坚持在您的页面(会话等)内查询结果?启用休眠 SQL 调试 (docs.jboss.org/hibernate/stable/core/reference/en/html/…) 并检查每次点击页面时是否确实执行了查询。【参考方案2】:

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

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

【讨论】:

问题是我们有一个本地应用程序和一个使用相同数据库的 Web 应用程序。如果我使用软件应用程序在数据库中进行更改,则只有在重新加载页面时才能在 Web 应用程序中更新数据。 (整个应用程序必须重新加载。)我没有找到任何我对休眠缓存进行的配置。【参考方案3】:

我不确定您是如何配置 Hibernate 会话的,但有些配置要求您在关闭会话之外刷新会话(例如,能够断开与数据库的底层 JDBC 连接的会话) .所以在评论回复中,你说你用session.close();结束你的工作——试着做:

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

改为看看这是否能解决您所看到的问题。

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

【讨论】:

OP 正在运行查询;没有什么可以冲洗的。本着同样的精神,查询必须明确标记为可缓存;没有/没有配置二级缓存提供程序不会有什么不同。【参考方案4】:

试试这个:

Session session = SessionFactoryUtil.getInstance().openSession();
session.clear(); 

或者,您可以显式使用无缓存的 StatelessSession。详细信息可以在这里找到:

https://www.hibernate.org/hib_docs/v3/api/org/hibernate/StatelessSession.html

【讨论】:

【参考方案5】:

阅读其他答案和 cmets 真的很奇怪。 您能否确认在每个页面调用时至少关闭一次 Hibernate 会话?您确定修改数据库的其他应用程序确实提交了更改吗?

【讨论】:

以上是关于休眠:必须重新启动 Java 应用程序才能重新加载数据的主要内容,如果未能解决你的问题,请参考以下文章

核心数据:为啥必须调用重新加载数据才能使我的应用程序正常工作?

如何动态加载和卸载(重新加载).dll 程序集

您是不是必须重新启动apache才能使.htaccess中的重写规则生效?

如何在 Android 上重新启动 Qt 或 c++ 中的程序?

在 IntelliJ 中强制重新加载环境变量...而不重新启动?

收到警告:SQL 错误:1205,SQLState:41000 错误:超过锁定等待超时;尝试重新启动事务。使用休眠保存记录