2011-12-08 49 views
2

您好我已經使用Zeroc Ice通信庫(v3.4.2)編寫了一個C#客戶端/服務器應用程序。爲什麼我得到Ice :: MemoryLimitException,即使有Ice.MessageSizeMax = 2000000

我從服務器傳輸一系列對象,然後以表格形式在客戶端中顯示它們。夠簡單。

我定義以下的片類型

enum DrawType { All, Instant, Raffle }; 

struct TicketSoldSummary { 
    int scheduleId; 
    DrawType dType; 
    string drawName; 
    long startDate; 
    long endDate; 
    string winningNumbers; 
    int numTicket; 
    string status; 
}; 
sequence<TicketSoldSummary> TicketSoldSummaryList; 

interface IReportManager { 
    [..] 
    TicketSoldSummaryList getTicketSoldSummary(long startTime, long endTime); 
}; 

當我把這種方法通常工作正常,但偶爾(大約的25%的時間)呼叫者得到一個冰:: MemoryLimitException。我們通常每次運行2-3個客戶。

我在互聯網上搜索的答案,我被告知增加Ice.MessageSizeMax,我做了。我已將MessageSizeMax增加到2,000,000 Kb,但它沒有任何區別,我只用31,000條記錄(大約1.8 Megs的數據)進行了測試,仍然得到Ice.MemoryLimitException。 1.8 Megs不是很大!

我做錯了什麼,或者Zeroc Ice有臭蟲嗎?

非常感謝任何能提供幫助的人。

+0

您是否確定在什麼情況下引發此異常?你能看看這個庫的源代碼嗎? –

+0

感謝您的回覆。當數據大小大於MessageSizeMax時,應該會發生此錯誤,但在我看來,它似乎與網絡速度更相關。例如通過VPN,我得到錯誤的90%的時間,但通過局域網只有25%的時間 –

+0

這將是有用的,如果你也可以發佈你的配置文件。例如,是否在所有組件(服務器,客戶機,Glacier2路由器,如果您正在使用它)上設置MessageSizeMax?查看異常以瞭解哪個組件正在投擲也很好。 – Josh

回答

0

我認爲MessageSizeMax需要在客戶端以及服務器端進行配置。也可以使用最大值(3)啓用跟蹤並檢查消息的大小(在電線上)

0

打開服務器端的Ice.Warn.Connections並查看日誌。還要確保正確應用客戶端最大郵件大小。我在客戶端上設置了Ice.MessageSizeMax,如下所示,

Ice.Properties properties = Ice.Util.createProperties(); 
properties.setProperty("Ice.MessageSizeMax", "2097152");//2gb in kb 
Ice.InitializationData initData = new Ice.InitializationData(); 
initData.properties = properties; 
Ice.Communicator communicator = Ice.Util.initialize(initData); 
相關問題