【问题标题】:The underlying provider failed on Open for some users while performance testing在性能测试时,底层提供程序对某些用户开放失败
【发布时间】:2026-02-18 18:55:01
【问题描述】:

我正在通过 gatling 性能工具为多个用户测试我的应用程序。当它为同时用户点击登录方法时,一些用户成功登录,但对于某些用户,我得到“底层提供程序在打开时失败。”错误。 下面是堆栈跟踪:

at System.Data.EntityClient.EntityConnection.OpenStoreConnectionIf(Boolean openCondition, DbConnection storeConnectionToOpen, DbConnection originalConnection, String exceptionCode, String attemptedOperation, Boolean& closeStoreConnectionOnFailure)

在 System.Data.EntityClient.EntityConnection.Open() 在 System.Data.Objects.ObjectContext.EnsureConnection() 在 System.Data.Objects.ObjectContext.CreateFunctionObjectResult[TElement](EntityCommand entityCommand,ReadOnlyMetadataCollection1 entitySets, EdmType[] edmTypes, MergeOption mergeOption) at System.Data.Objects.ObjectContext.ExecuteFunction[TElement](String functionName, MergeOption mergeOption, ObjectParameter[] parameters) at System.Data.Objects.ObjectContext.ExecuteFunction[TElement](String functionName, ObjectParameter[] parameters) at Pals.Entities.PalsEntities.sp_FetchVinStatusForAdminCountModifiedAsn(String dealerid, String oemid, String terminalId, Nullable1 fromDate,Nullable1 toDate, String onHoldDisplayFlag) at Portal.Business.Implementation.VinStatusCountAdmin.<>c__DisplayClass1.<FetchVinStatusForAdminCountAsn>b__0() at Microsoft.Practices.TransientFaultHandling.RetryPolicy.ExecuteAction[TResult](Func1 func) 在 Portal.Business.Implementation.VinStatusCountAdmin.FetchVinStatusForAdminCountAsn(字符串 DealerId,字符串 oemId,字符串 terminalId,DateTime fromDate,DateTime toDate,String onHoldDisplyaFlag) 在 Portal.Business.Managers.DashBoardManager.GetVinStatusCountForAdmin(字符串 DealerId,字符串 oemId,字符串 terminalId,DateTime fromDate,DateTime toDate,String boardStatus,String onHoldDisplayFlag) 在 Portal.Business.Managers.DashBoardManager.GetDashBoardParallel(SimpleSearch objdao,字符串 boardStatus) 在 Pals.Web.Controllers.SearchController.LoadDashBoardParallel(字符串 DealerId,String shipperId,String terminalId,String fromDate,String toDate,String boardStatus) 在 lambda_method(闭包,ControllerBase,对象 []) 在 System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext 控制器上下文,IDictionary2 parameters) at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary2 参数) 在 System.Web.Mvc.ControllerActionInvoker.c__DisplayClass15.b__12() 在 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter 过滤器,ActionExecutingContext preContext,Func1 continuation) at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList1 过滤器,ActionDescriptor actionDescriptor,IDictionary`2 参数) 在 System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName)

我在我的应用程序中使用实体框架。

【问题讨论】:

  • 有内部异常吗?如果有,是什么?
  • @BrendanGreen 我收到“底层提供程序在打开时失败。”也在内部异常中。
  • 是否存在内部异常?在我见过和读到的每一个案例中,总是里面有一个更详细的例外。

标签: entity-framework azure gatling


【解决方案1】:

(假设您使用的是 EF6)

您是否在 EF 配置中指定了 SqlAzureExecutionStrategy

如果不是(或者如果您不知道我在说什么),那么您需要在与您的 DbContext 相同的项目中创建一个继承 DbConfiguration 的类,并在其构造函数中调用SetExecutionStrategy 受保护的方法,像这样:

using System.Data.Entity; 
using System.Data.Entity.Infrastructure; 
using System.Data.Entity.SqlServer; 

namespace MyNamespace 
{ 
    public class MyConfiguration : DbConfiguration 
    { 
        public MyConfiguration() 
        { 
            SetExecutionStrategy("System.Data.SqlClient", () => new SqlAzureExecutionStrategy()); 
        } 
    } 
}

// from http://msdn.microsoft.com/en-us/library/dn456835.aspx

您可以使用SqlAzureExecutionStrategy 的配置来设置重试限制、超时等。

【讨论】:

  • ..我正在为重试策略和所有使用瞬态故障处理。