【问题标题】:Updating a singleton object using Spring & Hibernate on database update在数据库更新时使用 Spring 和 Hibernate 更新单例对象
【发布时间】:2014-09-28 12:00:47
【问题描述】:

我正在尝试更新一个单例对象(由 spring 在应用程序启动时使用 bean 定义加载)。然而,这个对象是从数据库 ( MySQL ) 中的表中加载的条目。

此表可以通过应用程序不时更新。

当数据库中的一行更新时,是否可以使用 spring 和 hibernate 更新单例对象?

【问题讨论】:

  • 如果它包含的数据足够小,可以保存在内存中,那么每次需要时从数据库中加载状态应该不是问题。如果确实需要,您可以随时使用二级缓存。
  • 我不明白你说的“可以通过应用程序更新表”的意思,应用程序是指来自同一个虚拟机的其他功能吗?或者这是否意味着另一个虚拟机或主机可以同时写表?如果更改来自另一个 vm 或主机,则您当前的对象已经脏了。正如@JBNizet 建议的那样,您每次都必须从数据库中加载它们以保持与数据库相同。
  • 我需要使用同一个虚拟机上的其他功能通过应用程序更新表。

标签: java database hibernate spring-mvc jpa


【解决方案1】:

您可以使用 Hibernate 事件监听器:

  1. 查看如何将事件侦听器添加到您的 Session Factory
  2. 您可以监听实体持久/合并/刷新事件。因为事件监听器是一个 Spring 对象,所以您可以将引用注入到您的单例中。
  3. 一旦您拦截了想要的事件,您就可以使用最新更新的数据更新单例状态。

【讨论】:

  • 只能在单个应用程序中使用。如果您有多个应用程序修改相同的数据,您将不会收到这些事件。
  • 问题是“这个表可以通过应用不定时更新。”
  • 使用 PostgreSQL 你可以得到database notifications 但他使用的是 MySQL。另一种解决方法是使用 JMS 链接事件和单例更新。
  • 数据库通知仍然不是你可以用 hibernate 或 jpa 事件处理的事件,如果我没记错的话需要在数据库端工作(你需要一些代码来触发 NOTIFY) .如果它是单个应用程序,仍然可以使用二级缓存,因为它可以自动更新,或者您可以使缓存中的元素无效。无需修改事件侦听器并尝试找出正确的对象。
  • 我们在接缝波长上。如果支持自定义回调,分布式二级缓存将起作用。 Oracle 支持advance queueing,但对于 MySQL,我可能会选择CQRS architecture
猜你喜欢
  • 1970-01-01
  • 2013-11-25
  • 1970-01-01
  • 1970-01-01
  • 2018-06-15
  • 2015-03-05
  • 1970-01-01
  • 1970-01-01
  • 2019-01-14
相关资源
最近更新 更多