让EntityFramework尊重mysql max_user_connections

时间:2016-04-18 18:43:12

标签: c# mysql entity-framework azure asp.net-web-api2

有没有办法让实体框架等待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" />

1 个答案:

答案 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 {}