有没有办法让实体框架等待max_user_connections连接已经打开?
我想我可以抓住Exception并重试或保留一个计数器,但最多感觉很麻烦。
我的Azure日志正在填写以下消息:
System.Data.Entity.Core.EntityException: The underlying provider failed on Open.
MySql.Data.MySqlClient.MySqlException:
Authentication to host 'xxx' for user 'yyy' using method 'mysql_native_password' failed with message:
User 'yyy' has exceeded the 'max_user_connections' resource (current value: 4)
我尝试将Max Pool Size=4
添加到连接字符串中,但这并没有帮助。
<add name="DbContext" connectionString="Database=db;Data Source=xxx;User Id=yyy;Password=zzz;CharSet=utf8;Persist Security Info=True;Convert Zero Datetime=True;Max Pool Size=4" providerName="MySql.Data.MySqlClient" />
答案 0 :(得分:0)
按照Vito的建议:抓住异常并让前端决定该怎么做:
在后端,我使用了PostSharp,这是.NET的Aspect-Oriented programming实现。它允许我用属性来装饰我的所有存储库以处理这个特定的异常。
在前端,我可能会做一些事情,比如等待400毫秒,然后在放弃之前再尝试1-3次。
在软件包管理器控制台中:
Install-Package PostSharp
您还需要安装PostSharp plugin for Visual Studio
[Serializable]
public class MaxMysqlConnectionExceptionHandlerAspect : OnExceptionAspect
{
public override void OnException(MethodExecutionArgs args)
{
if (args.Exception.InnerException != null && args.Exception.InnerException.Message.Contains("Too many connections"))
{
args.FlowBehavior = FlowBehavior.ThrowException;
args.Exception = new Exception("MAX_CONNECTIONS");
}
}
public override Type GetExceptionType(MethodBase method)
{
return typeof(EntityException);
}
}
然后装饰类或方法:
[MaxMysqlConnectionExceptionHandlerAspect]
public class FancyPantsService {}