2011-12-08 2 views
2

こんにちは私は、Zeroc Ice communication libary(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メグはあまり大きくありません!

Zeroc Iceに何か間違っている、またはバグがありますか?

何か助けてもらえますか?

+0

この例外がスローされる状況を判断しましたか。このライブラリのソースコードを見ることができますか? –

+0

返事をありがとう。このエラーは、データサイズがMessageSizeMaxよりも大きい場合に発生すると考えられますが、私の場合はネットワーク速度に関連しているようです。たとえばVPN経由では、時間の90%のエラーが発生しますが、LAN上ではわずか25%です。 –

+0

設定ファイルを投稿することができれば便利です。たとえば、MessageSizeMaxはすべてのコンポーネント(サーバー、クライアント、Glacier2ルーターを使用している場合)に設定されていますか?どのコンポーネントが投げているのかを知ることは例外でもあります。 – 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);