Кэширует ли WCF хранимые процедуры

#c# #sql #wcf

#c# #sql #wcf

Вопрос:

У меня есть служба WCF, к которой мой клиент обращается с просьбой запустить ее storedprocedure1 , с param1, param2 помощью и т.д.

Когда служба WCF получает этот вызов, она создает экземпляр класса, который создает экземпляр класса DAO. Класс DAO создает соединение, загружает параметры в SqlCommand объект, затем выполняет объект.

После завершения он закрывает SqlConnection , но не закрывает и не удаляет класс DAO, потому что для его запуска требуется несколько процедур.

Вот в чем проблема. Если я отредактирую storedprocedure1 , а затем вызову его через службу WCF, изменения, которые я внес в storedprocedure1 , не будут отражены, пока я не перезапущу службу WCF. Это похоже на то, что storedprocedure1 кэшируется в WCF.

Кто-нибудь еще сталкивался с этим и есть ли решение?

Ответ №1:

Я думаю, что служба WCF кэширует результаты хранимой процедуры.

Смотрите это:http://msdn.microsoft.com/en-us/library/ee230443.aspx

Комментарии:

1. Кэширование выходных данных по умолчанию не включено — кажется вероятным, что OP знал бы об этом, если бы это происходило.

2. вот атрибут для класса WCF

3. вот атрибут для класса WCF [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode. Разрешено)] [ServiceBehavior(InstanceContextMode = InstanceContextMode. Одиночный)] но я никогда явно не включаю кэширование для HTTP или в моей строке подключения. Я должен упомянуть, что проблема возникает при запуске WCF с ServiceHost в консольном приложении, предназначенном для тестирования. Я не видел этой проблемы в размещенном экземпляре IIS. Мы редко меняем хранимые процедуры при развертывании в IIS

Ответ №2:

Я думаю, что ключ, вероятно, заключается в этом утверждении:

но не закрывает и не удаляет класс DAO

Не видя кода для вашего класса DAO, трудно сказать, но кажется более вероятным, что результат запроса кэшируется вашим уровнем доступа к данным, чем то, что он кэшируется WCF.

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

Комментарии:

1. я так не думаю. экземпляр SqlCommand создается внутри предложения using . Также, когда я закрываю соединение, я удаляю его. Я изменил свой класс dao для реализации IDisposable, посмотрим, исправит ли это.

2. Вы были правы. Несмотря на то, что я удалял SqlConnection и SqlCommand, отказ от DAO позволял WCF кэшировать их, или сохранять план выполнения, или что-то в этом роде. У меня был dao в качестве частной переменной в классе, который вызывался WCF. Итак, я внес следующие изменения; 1) изменил свой класс DAO для реализации IDisposable и закрыл и удалил там SqlConnection; 2) Создал свой dao внутри предложения usings, а когда это было невозможно, удалил dao в try / finally. Итак, теперь это работает. Спасибо, что обратили внимание на очевидное.