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