Требуется предложение для достижения функциональности кэширования в WCF - PullRequest
0 голосов
/ 04 февраля 2011

У меня есть служба WCF, которая используется для получения некоторых данных из моей базы данных.Размер базы данных очень большой, примерно 2 ГБ.Поэтому я кеширую эти данные.Я хочу, чтобы когда служба хоста эти данные должны быть кэшированы, поэтому я сначала использовал

InstanceContextMode = InstanceContextMode.Single

Эта служба поведения позволяет мне, что я могу просто написать код кэширования в конструкторе службы, как конструктор будетвызываться только когда servicehost.open ();вызов метода.Всякий раз, когда клиент будет вызывать эту службу через прокси-конструктор, он не будет вызываться.Это работает очень хорошо.Позже я понял, что этот InstanceContextMode имеет проблему с производительностью, когда 1000 пользователей одновременно вызывают эту службу, потому что только один экземпляр этой службы обслуживает все запросы.Чтобы получить максимальную производительность, я изменил свои настройки на

InstanceContextMode = InstanceContextMode.PerCall with ConcurrencyMode = ConcurrencyMode.Multiple

Теперь я хочу получить ту же функцию кэширования, которая используется для кэширования данных хоста службы,Пожалуйста, помогите мне решить эту проблему.

Пожалуйста, дайте мне знать, либо через CustomBehaviors я могу этого достичь?

С уважением, Ризван

1 Ответ

0 голосов
/ 04 февраля 2011

Сочетание InstanceContextMode.PerCall с ConcurrencyMode.Multiple не имеет смысла.Экземпляр PerCall создает новый экземпляр службы для каждого запроса.Режим множественного параллелизма позволяет экземпляру службы обрабатывать несколько параллельных запросов.Как можно использовать экземпляр службы, который создается только для обработки одного запроса (PerCall), для обработки параллельных запросов (несколько)?

Я думаю, что проблема возникла при вызове службы синглтона (я полагаю, что вы также использовали ConcurrencyMode.Multiple) с 1000 одновременных пользователей просто основаны на том факте, что у сервера нет производительности для работы с таким количеством одновременных пользователей, или код службы / кеширование не оптимизированы.Это не будет решено путем использования экземпляров PerCall.

В любом случае, если вы хотите разделить некоторый кэш между несколькими экземплярами службы PerCall, вам нужно создать какой-нибудь известный объект, представляющий ваш кэш - используйте одноэлементный шаблон или локатор службы.Этот объект будет обрабатывать кэширование и одновременный доступ из экземпляров службы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...