2010-06-04 96 views
0

我有一個PHP的網絡服務器和.NET的移動應用程序。 .NET應用程序需要來自數據庫的數據,該數據庫現在由php web服務器提供。我對這種情況相當陌生,所以我不確定最佳實踐是什麼。我遇到了一些問題,我不確定如何克服它們。如何實現這個.NET客戶端和PHP服務器同步場景?

現在,我有以下設置。我運行一個PHP SOAP服務器,其中有幾個操作只是從數據庫中檢索數據。對於此Web服務,我創建了一個WSDL文件。在Visual Studio中,我使用WSDL文件爲我的項目添加了一個Web引用,併爲它生成了一些類。我簡單地稱之爲「MyWebService.GetItems();」我在.NET應用程序中獲得了一系列項目,這些項目直接來自數據庫。 接下來我還將所有這些檢索到的對象序列化到本地(永久)存儲。

我面臨一些挑戰,我不知道如何正確解決。

  • 的想法是移動客戶端的數據一次(在一天的開始),工作之前同步,然後用全天的本地存儲,並在該年底回同步天。

  • 目前全部數據通過SOAP下載,而不是一個子集(只需要什麼)。我如何知道應該將哪些新信息發送給客戶?只有服務器知道什麼是新的,但只有客戶端知道它已經擁有哪些數據。

  • 我現在似乎在做雙重工作。使用SOAP傳輸的數據基本上已經是序列化對象。但目前我首先通過SOAP檢索所有對象,而.NET框架會自動將其反序列化。然後我自己再次序列化所有數據。簡單地將它下載到存儲器,然後反序列化它會更有效率。

  • 移動設備沒有很多內存。在我的測試數據中,這不是一個真正的問題,但是可能有成千上萬的記錄,我可以想象這會成爲一個問題。目前,當我調用SOAP方法時,它將所有數據加載到內存中(作爲數組),但是如上所述,也許最好將它存儲到存儲中,並且只從存儲中檢索所需的對象。但是,我將如何存儲這個?數組將序列化爲一個大的XML(或二進制)文件,從中我無法選擇要加載的對象。我會(可能有十幾萬個)單獨的文件嗎?同樣在一天結束的時候,當我想將更改發送回服務器時,我將如何知道要發送哪些對象...因爲它們不在內存中?

我希望我的煩惱很明確,希望你能幫我弄清楚如何實現這個最好的方法。 :)

有些東西已經被修復了(就像在移動設備上使用.NET一樣,使用PHP並且有一個MySQL數據庫服務器),但其他的東西大多數情況下可以改變(如使用SOAP)。

回答

0

我從來沒有實現過這樣的事情,但形成了描述,我認爲移動設備的本地存儲充當緩存。如果本地存儲的大小與服務器端數據庫的大小相同,則可能不太實際。 所以我首先要弄清楚客戶端存儲的合適大小,然後嘗試找到合適的緩存替換狀態。這取決於您的應用程序的性質。原則是您保留最有可能用於緩存的數據。當您的應用程序需要掃描整個數據集時,即從mytable中選擇*,請在服務器端執行此類查詢。如果本地緩存未命中,請連接服務器。 要進行高速緩存替換,您可能需要將服務器端數據分成組,以便對於大多數組,如果您的緩存中有該組,那麼您知道緩存中的所有成員都已存在。例如,您可以在上次修改數據表的前一天對數據表進行分區,或按(行號mod組大小)進行分區。重點是,只緩存你在白天需要的信息。 如果無法決定需要哪些信息,則可以下載不在本地存儲中的較新組。如yestaday的所有記錄(因爲您已經有前天的所有記錄)。我認爲找到合適的方法來劃分記錄至關重要。

0

確定要同步的內容可能可以通過使用時間戳來解決。 IE瀏覽器。對於數據庫中的每條記錄(這適用於服務器以及客戶端),只要數據被修改,就會存儲一個時間戳。同步數據可以像存儲上次成功同步的(開始)時間戳一樣簡單,並獲取在該時間戳和當前時間之間更改的所有數據(應在同步成功完成後存儲)。只要確保你的時鐘已同步,否則這種方法將無法正常工作:p。

你也可以設置一個標誌,當某些東西被改變時,只有在同步時獲取標記的記錄(當然在同步成功後重置標誌)。

至於同步本身,除了SOAP之外,您還可以通過舊式的方式來完成同步操作,只需傳輸將在客戶端/服務器上進行復制後處理的文件即可。這樣,內存使用不會造成任何問題,因爲您可以根據需要逐位處理文件。

最大的挑戰(儘管取決於您的實際實施)可能會解決潛在的衝突,其中關於同一項目的數據在客戶端和服務器上都發生了變化。

相關問題