2011-12-08 1 views
2

Привет Я написал приложение клиент/сервер C#, используя Liber Liber Zeroc Ice (v3.4.2).Почему я получаю 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% времени) абонент получает Ice :: MemoryLimitException. Обычно мы работаем по 2-3 клиента одновременно.

Я искал в Интернете ответы, и мне сказали увеличить Ice.MessageSizeMax, что я и сделал. Я увеличил MessageSizeMax до 2 000 000 Кбайт, но это не имело никакого значения, я просто сделал тест с 31 000 записей (приблизительно 1,8 мегабайта данных) и по-прежнему получал Ice.MemoryLimitException. 1.8 Мега не очень большая!

Я делаю что-то неправильно или есть ошибка в Zeroc Ice?

Большое спасибо всем, кто может вам помочь.

+0

Вы определяете, в какой ситуации это исключение выбрано. Вы можете посмотреть исходный код этой библиотеки? –

+0

Спасибо за ответ. Эта ошибка должна произойти, когда размер данных больше, чем MessageSizeMax, но в моем случае он, по-видимому, больше связан с скоростью сети. Например, по VPN я получаю ошибку в 90% случаев, но по локальной сети только 25% времени –

+0

Было бы полезно, если бы вы могли также опубликовать свои файлы конфигурации. Например, установлен ли MessageSizeMax для всех компонентов (сервер, клиент, маршрутизатор Glacier2, если вы его используете)? Было бы неплохо увидеть исключение, чтобы знать, какой компонент метает. – Josh

ответ

0

Я считаю, что MessageSizeMax необходимо настроить как на стороне клиента, так и на стороне сервера. Также включите трассировку с максимальным значением (3) и проверьте размер сообщений (на проводе)

0

Включите Ice.Warn.Соединения на стороне сервера и просмотрите журналы. Также убедитесь, что размер сообщения Максимальный размер клиента применяется правильно. Я установил 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);