2010-08-16 62 views
1

对于需要很长时间打开的数据集(这是一个存储过程),我想在Datasnap服务器上实现某种缓存。如何“冻结”Datasnap服务器中的数据集?

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

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

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

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

回答

0

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

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

为防止不同的实例在确定是时候更新缓存的同时从数据库中提取信息,开发了非常基本的同步方法。数据恢复操作期间在磁盘上创建“控制文件”,并在完成或失败时删除。在启动数据操作之前,服务器实例会检查文件是否存在。如果存在,请输入一个等待循环,直到该文件不存在,并检查.cds关联文件中的有效数据...并根据该文件行事。 如果文件不存在,则尝试创建它,覆盖相同的毫秒情况。

不是全天候应用,只是一种12×6的:d。该方法被证明是非常好的,我不记得在近3年的时间里,这个粗鲁的同步失败了,我正在维护这个代码..但是你也许想创建一个更强大的机制。

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

所有的缓存工作都是使用提供者方法完成的。

因此,关系是这样的:对于需要到更新检查和OpenDataSet

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

伪代码是这样的:

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; 

我没有访问代码了,当然我不记得每一个细节,现在的服务器非常好,足够快,现在不需要考虑这个...希望解释机制的运作方式。如果您需要澄清或进一步帮助,请提交。

+1

哇...为什么这是为了downvote这个错? – jachguate 2010-11-11 20:14:26