如何在DataSnap服务器中“冻结”数据集?
-
28-09-2019 - |
题
对于一个需要很长时间才能打开的数据集(这是一个存储过程),我想在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;
我不再可以访问代码了,确保我不记得每个细节,当前的服务器非常好,快速地不需要现在就考虑一下...希望以其工作方式解释了机制。如果您需要澄清或进一步帮助,请致意。