对于一个需要很长时间才能打开的数据集(这是一个存储过程),我想在DataSnap服务器上实现某种缓存。

因此,如果第一次加载此数据集并将其传输到客户端(TCLIENTDATASET),则除非服务器在服务器上重新启动或“重新加载”过程,否则不应关闭并重新打开以下请求。

因此,在第一次打开之后,每个新客户端将仅接收数据集的副本(克隆),而无需刷新 /重新加载服务器端数据集。

为了简单地实现此数据集“缓存”,DataSnap Server DataModule不得每次会话创建DataSnap DataModule(因为对于每个新的会话,服务器端数据集将关闭,直到客户端发送请求以打开DataSetProvider)。也许我可以找到一个解决方案的解决方案,也可以用于会话数据符号,但我的基本问题是:

是否有一种方法可以覆盖数据集提供者中的方法,以便客户端仍然可以打开,但不能关闭服务器端数据集?

有帮助吗?

解决方案

几年前,我使用的一些数据纳普服务器必须从非常慢的SQL Server 7服务器中提取数据。然后,我根据TCLIENTDATASET制定了服务器缓存“玩具”,其中“缓存提供商”连接到那些“ Server ClientDataSets”,在此又依次从文件缓存或数据库中读取数据。

根据每个数据集的一组特定的硬编码规则,对缓存进行了刷新。当需要刷新缓存时,Server-ClientDataSet使用提供商通过Adoquery从数据库中获取数据,然后使用TCLIENTDATASET的二进制格式将数据保存到App-Server磁盘中。 (它可以在服务器实例之间进行缓存共享)。

为了防止不同的实例在确定该更新缓存的同时从数据库中获取信息,开发了非常基本的同步方法。在数据回归操作期间,在磁盘上创建了“控制文件”,并在完成或失败后删除。在启动PULS-DATA操作之前,服务器实例检查是否存在文件。如果存在,请输入等待环,直到不存在该文件并在.cds associated文件中检查有效的数据...并按照此操作。如果不存在文件,则试图创建它,覆盖同一毫秒的情况。

这是 不是 24x7应用程序,仅是一种12x6:d。这种方法被证明是非常好的,我不记得在将近3年的这种粗鲁同步的一次失败中,我维持了该代码。但是您可能想创建一个更强大的机制。

当无需刷新缓存时,数据只是从磁盘加载。

所有的缓存工作均使用提供商方法完成。

因此,关系就是这样:

//
//     Client                    Server
//---------------    -----------------------------------------------------------------
//                                               Cache refresh?
//
//                                                   Yes
//                                                  ----- Provider --- ADOQuery - DB
// ClientDataSet ---- Provider --- ClientDataSet --|
//                                                  ----- LoadFromFile
//                                                   No
//
//

伪代码需要进行更新检查和OpEndataSet这样:

function CacheRequiresRefresh: Boolean
begin
  if not IsPresentLocalData then
    Result := True
  else if ControlRecordIsMoreRecent then
    Result := True
  else if SomeOtherCondition then
    Result := True
  else
    Result := False;
end;

function OpenDataSet;
begin
  repeat
    if CacheRequiresRefresh then
    begin
      if not ControlFilePresent then
        if CreateControlFile then
        begin
          ConnectCDSToProvider;
          CDS.Open;
        end
      else
        if ControlFilePresent then
          WaitUntilControlFileIsNotPresent
    end
    else
      CDS.LoadFromFile('filename.cds');
  until CDS.Active;
end;

我不再可以访问代码了,确保我不记得每个细节,当前的服务器非常好,快速地不需要现在就考虑一下...希望以其工作方式解释了机制。如果您需要澄清或进一步帮助,请致意。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top