2010-08-16 60 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