Winforms 保持半静态数据新鲜的策略

Winforms 保持半静态数据新鲜的策略,winforms,caching,Winforms,Caching,我正在开发一款winform应用程序,该应用程序将被美国和海外的团体使用,它将取代使用旧技术构建的现有应用程序 由于在美国对数据库服务器的调用过多,海外旧应用程序的性能非常慢,因此我希望在客户端上缓存尽可能多的内容 对于不经常更改但可能更改的内容,缓存数据的最佳方法是什么?如何防止数据过时,而不在每次加载时将其完全拉入?一个快速的解决方案是为数据创建某种类型的校验和,客户端只在开始时要求这样做。如果相同,则不需要更多数据,该部分是最新的。如果数据发生变化,则总和也会发生变化,客户机将与新数据一起

我正在开发一款winform应用程序,该应用程序将被美国和海外的团体使用,它将取代使用旧技术构建的现有应用程序

由于在美国对数据库服务器的调用过多,海外旧应用程序的性能非常慢,因此我希望在客户端上缓存尽可能多的内容


对于不经常更改但可能更改的内容,缓存数据的最佳方法是什么?如何防止数据过时,而不在每次加载时将其完全拉入?

一个快速的解决方案是为数据创建某种类型的校验和,客户端只在开始时要求这样做。如果相同,则不需要更多数据,该部分是最新的。如果数据发生变化,则总和也会发生变化,客户机将与新数据一起获得新的总和


每次只传输看起来应该少于您所有的数据。

您可以保留一个SQL表函数或视图或其他轻量级的东西,其中可能有一个水印或其他指标,用于给定的一组对象,这些对象可能报告修订ID或0表示未更改,1表示已更改,然后只刷新那些需要更新的对象

如果您的数据很少更改,您可以使用sql触发器设置与“更新”标志等效的标志,然后简单地在任何其他客户机-服务器通信上使用该标志。如果将insert/update/delete触发器添加到所有半静态表和一个看门狗表中,您就可以开始了。

我认为最好的方法是创建一个单独的表来跟踪数据。该表将只包含一个表名列表,以及上次修改该表的时间。然后,您将创建一个触发器,每当在该表上发生insert/update/delete时,该触发器都会更新字段。当客户机想要检查数据时,您将检索数据并从该表中获取日期并存储它。下次客户机需要数据时,只需在该表中查找表名,获取日期并将其与您拥有的日期进行比较。如果数据库中的值更大,则是从服务器获取数据的时候了


这种方法唯一的缺点是,对于表中的任何更改,您都将转到数据库并再次检索所有数据,即使更改不会影响特定的SQL查询。如果您的数据不经常更改,那么这应该不会太重要。

如果应用程序本身可以判断数据是否有更新,那么请求延迟缩放可能是最简单的选择。当应用程序启动时,请求数据,然后在最小刷新延迟后再次请求。如果数据没有更改,则请求之间的刷新延迟将增加一倍。当未检测到任何更改(可能有最大限制)并且您已设置为继续时,继续加倍延迟。这是一种减少服务器负载的常见模式,在不更改模式或web服务的情况下,很容易在客户端实现。

不确定数据集的外观,但如何在数据集上计算类似SHA256的散列,并将该散列存储在客户端和服务器上。然后在从服务器获取之前,只获取散列并与客户端上的本地散列进行比较。如果哈希匹配,则使用本地存储的数据集。

您必须在要缓存的数据库或表发生更改时保留时间戳。如果存在相关的表,或在类似时间范围内更改的表,则可以将它们分组到共享相同时间戳的族中

无论何时需要数据,都必须首先要求提供时间戳。如果未更改,请使用缓存的数据。如果已更改,请请求新数据,更新缓存,并递归请求所有祖先数据的时间戳

校验和不起作用,因为它们可能会发生冲突,因此您必须要求提供新数据以检查冲突。旧的/更改的标志不起作用,因为您不知道数据何时更改,它可能早于您以前的时间戳。版本ID在每次更改后都会增加,但不会减少,也可以使用


如果您使用的是RESTful web服务,GET头代码将只返回HTTP头,其中可以包含时间戳。如果您的web服务不包含时间戳,则必须定义新的时间戳以返回时间戳。

很抱歉,刚才luvat提到了类似的解决方案。我可以补充一点:您可以在服务器上有一个表来存储您使用的sql查询以及用于该查询的哈希。因此,在执行请求时,首先计算查询字符串上的哈希值,然后向服务器请求与查询字符串哈希值关联的数据哈希值,该数据哈希值将不起作用。如果校验和更改,则数据不同,但如果数据更改,则校验和可能不会更改。海报需要知道数据何时更改,而不是校验和。