幾年前,我工作的一些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;
我沒有訪問代碼了,當然我不記得每一個細節,現在的服務器非常好,足夠快,現在不需要考慮這個...希望解釋機制的運作方式。如果您需要澄清或進一步幫助,請提交。
哇...爲什麼這是爲了downvote這個錯? – jachguate 2010-11-11 20:14:26