问题陈述: 示例:我有一个名为“STUDENT”的表,它有 10 行,并认为其中一行的名称为“Jack”。因此,当我的服务器启动并运行时,我将数据库放入缓存内存中,以便我的应用程序具有“jack”值,并且我在我的应用程序中使用它。
现在外部源更改了我的“STUDENT”表,并将名称“Jack”更改为“Prabhu Jack”。我希望将更新的信息尽快添加到我的应用程序中,而不需要重新加载/刷新到我的应用程序中。我不想运行一些恒定的线程来监视和更新我的应用程序。我想要的只是 hibernate 的一部分或任何可行的解决方案来实现这一目标?
..
最佳答案
您所描述的是拉还是推送更新的经典案例。
拉动
此方法依赖于使用某些后台线程或任务系统的应用程序,这些线程或任务系统定期轮询资源并请求所需的信息。应用程序有责任执行此任务。
为了将拉机制与 Hibernate 的缓存实现结合使用,这意味着您希望将 Hibernate 查询结果存储在 L2 缓存实现中,例如 ehcache .
您的 ehcache 将指定存储容量和过期详细信息,您只需在需要的每个点查询学生数据即可。首先会查询二级缓存,二级缓存位于应用服务器端,只有在二级缓存过期时才会查询数据库。
缺点是您需要为 L2 缓存指定合理的生存时间设置,以便在更新行后通过查询在合理范围内更新缓存。根据更改和使用的频率,也许 5 分钟的窗口就足够了。
使用 L2 缓存可以避免对无用的后台轮询线程的需要,并允许您在由缓存实现支持的 Hibernate 框架内指定合理的轮询时间。
推
这种方法依赖于发生变化的点,能够通知相关方某些内容发生了变化,并允许相关方执行某些操作。
为了使用推送机制,您的应用程序需要公开一种方式来告知发生了更改,最好是更改实际上是什么。然后,当您的外部源修改相关表时,该操作需要引发事件并通知感兴趣的各方。
构建此方案的一种方法是使用 JMS 代理,让外部源向队列提交 JMS 消息,并让您的应用程序订阅 JMS 队列以在发送消息时读取该消息。
另一个解决方案是将外部源操作数据的位置与您的应用程序紧密结合起来,这样外部源不仅可以操作相关数据,还可以向您的应用程序发送 JSON 请求,从而允许它立即更新其内部缓存。
结论
如果您希望有效地解耦外部源端和您的应用程序,那么使用推送情况可能需要引入额外的中间件组件。但它确实带来了额外的好处,即数据库和应用程序缓存之间的最终一致性应该相对实时地实现。该解决方案也不需要在启动后查询数据库来获取这些行。
使用拉动情况不需要比您可能已在应用程序中使用的内容更多的内容,除了可能使用受支持的 L2 缓存提供程序而不是某些自行开发的解决方案之外。但是,数据库和应用程序缓存之间的最终一致性完全取决于该实体缓存的 TTL 配置。但请注意,一旦您的 TTL 过期,此解决方案将继续查询数据库以刷新缓存。
关于java - ORM 查询?或者更新数据库表信息应该更新到hibernate web应用程序中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40244665/