我的要求是我有服務器J2EE Web應用程序和客戶端J2EE Web應用程序。有時客戶端可以下線。當客戶端上線時,他應該能夠同步來回更改。另外,我應該能夠根據某些過濾器/規則來控制哪些行/表需要同步。有沒有現成的Java框架可以做到這一點?如果我需要自己實施,您可以提出哪些不同的策略?離線/在線數據同步的策略
我的想法之一是在同步期間維護sql日誌並在另一側執行相同的語句。你看到這個策略有什麼問題嗎?
我的要求是我有服務器J2EE Web應用程序和客戶端J2EE Web應用程序。有時客戶端可以下線。當客戶端上線時,他應該能夠同步來回更改。另外,我應該能夠根據某些過濾器/規則來控制哪些行/表需要同步。有沒有現成的Java框架可以做到這一點?如果我需要自己實施,您可以提出哪些不同的策略?離線/在線數據同步的策略
我的想法之一是在同步期間維護sql日誌並在另一側執行相同的語句。你看到這個策略有什麼問題嗎?
有許多用於數據同步/複製的Java庫。我知道的兩個是daffodil和SymmetricDS。在以前的生活中,我愚蠢地實現了(使用Java)我自己的數據複製過程。這看起來應該是相當直接的事情,但如果數據可以同時在多個地方更新,那就很複雜。我強烈建議您使用上述項目之一來嘗試繞過自己處理這種複雜性。
與同步有關的重大問題是,用戶在離線狀態下編輯某些內容時,它會在同一時間在線編輯。您需要合併兩個更改的數據片段,或者處理UI以允許用戶說出哪個版本是正確的。如果你消除了同時編輯的可能性,那麼你不必解決這個棘手的問題。
該方法通常是爲所有表添加一個字段'modified',並將給定行中給定記錄的客戶端修改字段與服務器的修改日期進行比較。如果它們不匹配,則替換服務器的數據。
小心使用自動生成的密鑰 - 您需要確保從客戶端複製到服務器時保持數據完整性。在服務器上再次嚴格運行SQL語句可能會使您處於自動生成的密鑰已更改的情況,並且突然間,您的外鍵指向的記錄超出您的預期。
通常從其他來源導入數據時,您會跟蹤來自外部源的主鍵以及您自己的個人主鍵。這使得確定數據集之間的變化和差異更容易解決困難的同步情況。
您的同步器需要確定數據何時可以更新以及何時需要調解潛在的衝突。我寫了一個paper that explains how to do this using logging and algebraic laws。
在您的應用程序中,什麼最適合作爲客戶端數據存儲?您可以選擇使用Web DB或IndexedDB到HTML 5的LocalStorage API之類的嵌入式數據庫,如SQLite或消息隊列或某個對象存儲或者(如果這些都不能使用,因爲它是Web應用程序)文件/文檔。
查看論文Gold Rush: Mobile Transaction Middleware with Java-Object Replication。微軟的偶爾連接系統的文檔描述了兩種方法:面向服務或面向消息和麪向數據。 Gold Rush採取了較早的方法。後面的方法使用數據庫合併複製。
我投下了這個(對不起),因爲我認爲它大大簡化了涉及的問題。它根本沒有解決安全問題或選擇性同步。來自Stettler的論文是一個很好的介紹問題(http://www.ifi.uzh.ch/archive/mastertheses/DA_Arbeiten_2003/Stettler_Christian.pdf) – 2010-07-15 06:08:07
感謝您的信息。我認爲哈姆雷特的鏈接是一個很好的參考。 Kieveli回答的關鍵點對於需要30秒鐘讀數的底漆來說已經足夠了。 – 2011-03-21 07:31:37