EF Compiled Query, иногда вызывающий SqlException - PullRequest
3 голосов
/ 18 ноября 2010

Я использую скомпилированный запрос, который довольно сложен для выполнения части моей логики запросов в приложении, которая абстрагирует скомпилированный запрос за Func <>. Я периодически (один раз из тысячи пробежек) получаю следующие исключения:

SqlException:
The parameterized query '(@p__linq__0 int,@p__linq__1 nvarchar(4000),@p__linq__2 varchar(' expects the parameter '@p__linq__1', which was not supplied.

And InvalidOperationException:
Parameters cannot be added or removed from the parameter collection, and the parameter collection cannot be cleared after a query has been evaluated or its trace string has been retrieved.  

Моя первая реакция, когда я увидел второе исключение, заключается в том, что я сталкиваюсь с проблемами параллелизма. Это делается из службы WCF с использованием basicHttpBinding в конфигурации по умолчанию для поведения службы, это означает, что режим параллелизма является единичным. Я не использую InstanceContextMode single, но вместо этого PerSession по умолчанию, это может вызвать проблемы?

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

Чтобы добавить к проблеме, я не могу воспроизвести эти ошибки на локальных машинах, исключения происходят во время процедуры обработки на удаленных серверах по вечерам и только один или два раза в ночь. Надеюсь, кто-то еще испытал нечто подобное. Я могу попробовать несколько вещей, таких как изменение instancecontextmode, добавление увеличенного времени ожидания SQL Server, но я бы предпочел узнать, в чем проблема, прежде чем пытаться обойти. Я сделал запись нескольких случаев исключения, вот кадр стека для одного из InvalidOperationExceptions:

System.Data.Objects.ObjectParameterCollection.Add(ObjectParameter parameter)
System.Data.Objects.ELinq.CompiledELinqQueryState.GetExecutionPlan(Nullable`1 forMergeOption)
System.Data.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption)
System.Data.Objects.ObjectQuery`1.System.Collections.Generic.IEnumerable&lt;T&gt;.GetEnumerator()
System.Linq.Enumerable.Count[TSource](IEnumerable`1 source, Func`2 predicate)
Processor.Processor.&lt;&gt;c__DisplayClass10.&lt;GetObjectContexts&gt;b__9(ObjectContextMetadata q) in C:\Documents and Settings\eugarps\My Documents\SomeService-development\Processor\Processor.cs:line 174
System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
System.Linq.Enumerable.&lt;DistinctIterator&gt;d__81`1.MoveNext()
System.Linq.Enumerable.Contains[TSource](IEnumerable`1 source, TSource value, IEqualityComparer`1 comparer)
Processor.Processor.&lt;&gt;c__DisplayClass10.&lt;GetObjectContexts&gt;b__c(ObjectContextMetadata q) in C:\Documents and Settings\eugarps\My Documents\SomeService-development\Processor\Processor.cs:line 179
System.Linq.Enumerable.WhereEnumerableIterator`1.MoveNext()
Processor.Processor.ResolveGeoCode(AddressItem address, String product) in C:\Documents and Settings\eugarps\My Documents\SomeService-development\Processor\Processor.cs:line 273
Company.ProcessingLogic.SomeService.SomeServiceService.ResolveDepotWithMask(AddressItem address, String product, DeliveryMap map, IGeocoder geocoder) in C:\Documents and Settings\eugarps\My Documents\SomeService-development\SomeServiceService\SomeServiceService.cs:line 136
Company.ProcessingLogic.SomeService.SomeServiceService.ResolveDepotWithMask(AddressItem address, String product, DeliveryMap map) in C:\Documents and Settings\eugarps\My Documents\SomeService-development\SomeServiceService\SomeServiceService.cs:line 59
Company.ProcessingLogic.SomeService.SomeServiceService.ResolveDepot(AddressItem address, String product) in C:\Documents and Settings\eugarps\My Documents\SomeService-development\SomeServiceService\SomeServiceService.cs:line 53
SyncInvokeResolveDepot(Object , Object[] , Object[] )
System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]&amp; outputs)
System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc&amp; rpc)
System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc&amp; rpc)
System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc&amp; rpc)
System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)

1 Ответ

0 голосов
/ 18 ноября 2010

Это может быть связано с данными, которые вы отправляете. Проверьте, отправляете ли вы пустое значение.

Редактировать

Это также может быть условием гонки.Возможно ли, чтобы 2 потока создавали запрос одновременно, используя один и тот же объект.Если это так, вы можете получить ситуацию, когда один и тот же параметр добавляется дважды.

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