代码之家  ›  专栏  ›  技术社区  ›  mjn anonym

如何“冻结”Datasnap服务器中的数据集?

  •  1
  • mjn anonym  · 技术社区  · 14 年前

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

    对于此数据集“缓存”的简单实现,不能为每个会话创建Datasnap服务器datamodule(因为对于每个新会话,服务器端数据集将关闭,直到客户端发送打开DatasetProvider的请求)。也许我可以找到一种方法来克隆会话数据模块的数据集,但我的基本问题是:

    是否有方法重写DatasetProvider中的方法,以便客户端仍然可以打开,但不能关闭服务器端数据集?

    1 回复  |  直到 14 年前
        1
  •  0
  •   jachguate    14 年前

    几年前,我工作的一些DataSnap服务器不得不从非常慢的sqlserver7服务器中提取数据。然后,我基于TClientDataSets设计了一个服务器缓存“玩具”,其中“缓存提供者”连接到那些“服务器ClientDataSets”,后者依次从文件缓存或数据库中读取数据。

    缓存是根据每个数据集的一组特定硬编码规则刷新的。当需要刷新缓存时,server ClientDataSet使用提供程序通过ADOQuery从数据库中提取数据,然后使用TClientDataSet的二进制格式将数据保存到app server磁盘。(它支持服务器实例之间的缓存共享)。

    如果文件不存在,则尝试创建它,覆盖相同的毫秒大小写。

    这是 一个24x7的应用程序,只是一种12x6:D。这个方法被证明是非常好的,我不记得在我维护代码的近3年时间里,这种粗鲁的同步有一次失败。。但你可能想创造一个更强大的机制。

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

    所以,关系是这样的:

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

    需要更新check和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;
    

    我已经没有访问代码了,当然我记不清每一个细节,很高兴目前的服务器非常好,速度足够快,不需要考虑这个了。。。霍普解释了它的工作原理。如果您需要澄清或进一步的帮助,请告知。