Web API 使用几天后总是无法连接到 MYSQL 数据库

Web API always can't connect to MYSQL db after using some days later

我有一个 Web API,在它工作了大约 20 天后无法连接到那个 MYSQL 服务器,它无法正常工作,因为它恢复正常我必须重新启动服务器,就是这样真的很奇怪,我尝试使用 navicat 之类的其他工具包连接到那个 MYSQL 服务器,但在它无法连接到该数据库的时候,它也不能正常工作,它只是无法连接到 MySQL显示状态代码的数据库,如 S100010055(我尝试 google 该代码,它不起作用,我不知道如何处理该问题) 我的 Web API 在 VS 2015 上使用 EF 5.0、.NET 4.6 在 C# 中构建。我将其部署在 Windows 2008 R2 服务器上,此 Web 服务器上的 IIS 上有 3 个 Web api,还有其他服务器也是 Windows 2008 R2,它有MySQL服务器版本是5.5,由于我只是开发人员,我只是在web服务器级别记录异常,我试图在MySQL端找到日志文件,DBA没有'不记录该数据库上的任何文件,这真的很不幸。

这是我的控制器代码

  public DMLjfretModels uploadjfdetails(DMLjfparamsModels dmlparms)
    {
        DMLjfretModels dmlret = new Models.DMLjfretModels();
        dmlret.returncode = 0;
        dmlret.expmsg = "";



        if (dmlparms.clicardjftype != "1" && dmlparms.clicardjftype != "2" && dmlparms.clicardjftype != "4")
        {
            dmlret.returncode = -30;
            return dmlret;
        }

        if ((dmlparms.clicard??"").Trim().Length != 10)
        {
            dmlret.returncode = -60;
            dmlret.expmsg = "cardno is invald";
            return dmlret;
        }

        try
        {
            using (var context = new testEntities())
            {
                context.Database.CommandTimeout = 180;
                if (ModelState.IsValid)
                {
                    Globalvariable glv = new Globalvariable();
                    int result = glv.validate(dmlparms.username, dmlparms.password, dmlparms.curno);
                    if (result!=0)
                    {
                        dmlret.returncode = result;
                        return dmlret;
                    }

                    string clicardstring = dmlparms.clicard.Trim();
                    var memberresult = context.wp_client_card.Where(x => x.cli_card == clicardstring);
                    int therecordscount = memberresult.Count();

                    try
                    {
                        string filePath = @"d:\log\lognumber" + DateTime.Now.ToString("yyyy-MM-dd") + ".txt"; 

                        using (StreamWriter writer = new StreamWriter(filePath, true))
                        {
                            writer.WriteLine("cli_card:" + clicardstring ?? "" + ",listno:" + dmlparms.clicardjflistno ?? "" + ",countvalue:" + therecordscount.ToString());
                            writer.WriteLine(Environment.NewLine + "-----------------------------------------------------------------------------" + Environment.NewLine);
                        }

                    }
                    catch (Exception ex)
                    {
                        string filePath = @"d:\log\Error" + DateTime.Now.ToString("yyyy-MM-dd") + ".txt";

                        using (StreamWriter writer = new StreamWriter(filePath, true))
                        {
                            writer.WriteLine("Message :" + ex.Message + "<br/>" + Environment.NewLine + "StackTrace :" + ex.StackTrace +
                               "" + Environment.NewLine + "Date :" + DateTime.Now.ToString());
                            writer.WriteLine(Environment.NewLine + "-----------------------------------------------------------------------------" + Environment.NewLine);
                        }
                    }

                    if (therecordscount == 0)
                    {
                        dmlret.returncode = -25;
                        return dmlret;
                    }



                    if (dmlparms.clicardjftype== "1" || dmlparms.clicardjftype == "2")
                    {
                        foreach (DMLdetailModels dm in dmlparms.clidetails)
                        {
                            if (string.IsNullOrEmpty(dm.prodno) || string.IsNullOrEmpty(dm.batchno)
                                || string.IsNullOrEmpty(dm.prodadd) || dm.prodnum <= 0.0 || dm.sellprice <= 0.0
                                || dm.stdprice <= 0.0  || dm.clicardjfnum<=0.0)
                            {
                                dmlret.returncode = -33;
                                return dmlret;
                            }
                        }
            
                    }
                    else
                    {
                        decimal thesum = context.wp_cli_card_jf.Where(x => x.cli_card==dmlparms.clicard.Trim()) 
                         .Sum( 
                                        d =>
                                        ((d.cli_card_jf_type == "1") && (d.cli_card_jf_num != null))
                                         ? d.cli_card_jf_num
                                          : ((d.cli_card_jf_type == "2") && (d.cli_card_jf_num != null))
                                          ? ((Decimal?)((Decimal)0) - d.cli_card_jf_num)
                                          : ((d.cli_card_jf_type == "4") && (d.cli_card_jf_num != null))
                                          ? ((Decimal?)((Decimal)0) - d.cli_card_jf_num)
                                          : (Decimal?)((Decimal)0)
                                           )??0.0M;

                        

                        decimal thesumjf = 0.0M;
                        foreach(DMLdetailModels details in dmlparms.clidetails)
                        {
                            thesumjf = thesumjf + Convert.ToDecimal( details.clicardjfnum);
                        }

                        if (thesum< thesumjf)
                        {
                            dmlret.returncode = -50;
                            return dmlret;
                        }

                    }

                    foreach (DMLdetailModels detail in dmlparms.clidetails)
                    {
                        //write the data into my database
                        context.wp_cli_card_jf.Add(wjf);
                    }

                    context.SaveChanges();
                    return dmlret;

                }
                else
                {   
                    dmlret.returncode = -20;
                    return dmlret;
                }
            }
        }
        catch (Exception ex)
        {
           
           logfile(ex);
        }

    }

顺便说一句,我也在网络中记录了请求和响应api

      public class LogRequestAndResponseHandler : DelegatingHandler
{
    protected override async Task<HttpResponseMessage> SendAsync(
        HttpRequestMessage request, CancellationToken cancellationToken)
    {
        String UUID = Guid.NewGuid().ToString();
        // log request body
        string requestBody = await request.Content.ReadAsStringAsync();
        string requestmethod = request.RequestUri.ToString();
        string mymethod = requestmethod.ToLower();



        // let other handlers process the request
        var result = await base.SendAsync(request, cancellationToken);

        if (result.Content != null)
        {
            // once response body is ready, log it
            var responseBody = await result.Content.ReadAsStringAsync();
            logrequestnresponse(UUID, requestBody, responseBody.ToString(), mymethod);
        }

        return result;
    }


    private void logrequestnresponse(string uuid, string requestbody, string responsebody,string requestmethod)
    {
        try
        {
             using (var context = new testEntities())
              {
                  context.Database.CommandTimeout = 180;
                  wp_web_api_log wplog = context.wp_web_api_log.Create();
                  wplog.row_index = uuid;
                  wplog.request_detail = requestbody;
                  wplog.request_url = requestmethod;
                  wplog.response_detail = responsebody;
                  context.wp_web_api_log.Add(wplog);
                  context.SaveChanges();
              } 

            string filePath = @"d:\log\Logfile.txt";

      
        }
        catch (Exception ex)
        {
            
             logfile(ex);

         }
    }
}

我的日志文件记录了它在那段时间无法连接到 MYSQL 数据库

 Message :The underlying provider failed on Open<br/>
 StackTrace :   at System.Data.Entity.Core.EntityClient.EntityConnection.Open()
 at System.Data.Entity.Core.Objects.ObjectContext.EnsureConnection(Boolean shouldMonitorTransactions)
 at System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Func`1 func, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction, Boolean releaseConnectionOnSuccess)
 at System.Data.Entity.Core.Objects.ObjectContext.SaveChangesToStore(SaveOptions options, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction)
 at System.Data.Entity.Core.Objects.ObjectContext.SaveChangesInternal(SaveOptions options, Boolean executeInExistingTransaction)
 at System.Data.Entity.Internal.InternalContext.SaveChanges()
 at dggyapi.LogRequestAndResponseHandler.Logrequestnresponse(String uuid, String requestbody, String responsebody, String requestmethod),"},method:querymember
 Overall Exception:System.Data.Entity.Core.EntityException: The underlying provider failed on           Open---> MySql.Data.MySqlClient.MySqlException: Unable to connect to any of the specified MySQL hosts. ---> System.Net.Sockets.SocketException: An operation on a socket could not be performed because the system lacked sufficient buffer space or because a queue was full.
 at System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress)
 at System.Net.Sockets.Socket.InternalBind(EndPoint localEP)
 at System.Net.Sockets.Socket.BeginConnectEx(EndPoint remoteEP, Boolean flowContext, AsyncCallback callback, Object state)
 at System.Net.Sockets.Socket.BeginConnect(EndPoint remoteEP, AsyncCallback callback, Object state)
 at MySql.Data.Common.MyNetworkStream.CreateSocketStream(MySqlConnectionStringBuilder settings, IPAddress ip, Boolean unix)
 at MySql.Data.Common.MyNetworkStream.CreateStream(MySqlConnectionStringBuilder settings, Boolean unix)
 at MySql.Data.Common.StreamCreator.GetStream(MySqlConnectionStringBuilder settings)
 at MySql.Data.MySqlClient.NativeDriver.Open()
 ---  End of inner exception stack trace ---
 at MySql.Data.MySqlClient.NativeDriver.Open()
 at MySql.Data.MySqlClient.Driver.Open()
 at MySql.Data.MySqlClient.Driver.Create(MySqlConnectionStringBuilder settings)
 at MySql.Data.MySqlClient.MySqlPool.GetPooledConnection()
 at MySql.Data.MySqlClient.MySqlPool.TryToGetDriver()
 at MySql.Data.MySqlClient.MySqlPool.GetConnection()
 at MySql.Data.MySqlClient.MySqlConnection.Open()
 at System.Data.Entity.Infrastructure.Interception.InternalDispatcher`1.Dispatch[TTarget,TInterceptionContext](TTarget target, Action`2 operation, TInterceptionContext interceptionContext, Action`3 executing, Action`3 executed)
 at System.Data.Entity.Infrastructure.Interception.DbConnectionDispatcher.Open(DbConnection connection, DbInterceptionContext interceptionContext)
 at System.Data.Entity.Core.EntityClient.EntityConnection.Open()
 ---  End of inner exception stack trace ---
 at System.Data.Entity.Core.EntityClient.EntityConnection.Open()
 at System.Data.Entity.Core.Objects.ObjectContext.EnsureConnection(Boolean shouldMonitorTransactions)
 at System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Func`1 func, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction, Boolean releaseConnectionOnSuccess)
 at System.Data.Entity.Core.Objects.ObjectContext.SaveChangesToStore(SaveOptions options, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction)
 at System.Data.Entity.Core.Objects.ObjectContext.SaveChangesInternal(SaveOptions options, Boolean executeInExistingTransaction)
 at System.Data.Entity.Internal.InternalContext.SaveChanges()
 at dggyapi.LogRequestAndResponseHandler.Logrequestnresponse(String uuid, String requestbody, String responsebody, String requestmethod)
 Innerexception:System.Net.Sockets.SocketException (0x80004005): An operation on a socket could not be performed because the system lacked sufficient buffer space or because a queue was full.
 at System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress)
 at System.Net.Sockets.Socket.InternalBind(EndPoint localEP)
 at System.Net.Sockets.Socket.BeginConnectEx(EndPoint remoteEP, Boolean flowContext, AsyncCallback callback, Object state)
 at System.Net.Sockets.Socket.BeginConnect(EndPoint remoteEP, AsyncCallback callback, Object state)
 at MySql.Data.Common.MyNetworkStream.CreateSocketStream(MySqlConnectionStringBuilder settings, IPAddress ip, Boolean unix)
 at MySql.Data.Common.MyNetworkStream.CreateStream(MySqlConnectionStringBuilder settings, Boolean unix)
 at MySql.Data.Common.StreamCreator.GetStream(MySqlConnectionStringBuilder settings)
 at MySql.Data.MySqlClient.NativeDriver.Open()

我刚刚重新启动了我的网络服务器,并尝试跟踪持久性,我发现了

  mysql> show status where variable_name like 'thread%';
  +-------------------+-------+
  | Variable_name     | Value |
  +-------------------+-------+
  | Threads_cached    | 4     |
  | Threads_connected | 41    |
  | Threads_created   | 53302 |
  | Threads_running   | 2     |
  +-------------------+-------+
  4 rows in set

  mysql> show processlist;
    +----------+---------+--------------------+--------+---------+------+-------+------------------+
  | Id       | User    | Host               | db     | Command | Time | State | Info             |
        +----------+---------+--------------------+--------+---------+------+-------+------------------+
  |  3540670 | myuser  | localhost:56924    | NULL   | Sleep   |  111 |       | NULL             |
  |  3540671 | myuser  | localhost:56925    | NULL   | Sleep   |  111 |       | NULL             |
  |  3540692 | myuser  | localhost:56928    | NULL   | Sleep   |    2 |       | NULL             |
  | 11278418 | myuser  | 192.168.0.200:1038 | mydb   | Sleep   |   44 |       | NULL             |
  | 11278428 | myuser  | 192.168.0.200:1043 | mydb   | Sleep   |   38 |       | NULL             |
  | 11278439 | myuser  | 192.168.0.200:1044 | mydb   | Sleep   |   33 |       | NULL             |
  | 11278441 | myuser  | 192.168.0.200:1045 | mydb   | Sleep   |   15 |       | NULL             |
  | 11278597 | myuser  | 192.168.0.200:1077 | mydb   | Sleep   |   18 |       | NULL             |
  | 11278602 | myuser  | 192.168.0.200:1078 | mydb   | Sleep   |    6 |       | NULL             |
  | 11278627 | myuser  | 192.168.0.200:1080 | mydb   | Sleep   |  102 |       | NULL             |
  | 11278654 | myuser  | 192.168.0.200:1082 | mydb   | Sleep   |  102 |       | NULL             |
  | 11278668 | myuser  | 192.168.0.200:1087 | mydb   | Sleep   |   97 |       | NULL             |
  | 11278710 | myuser  | 192.168.0.200:1088 | mydb   | Sleep   |   89 |       | NULL             |
  | 11278768 | myuser  | 192.168.0.200:1089 | mydb   | Sleep   |   89 |       | NULL             |
  | 11278780 | myuser  | 192.168.0.200:1090 | mydb   | Sleep   |   88 |       | NULL             |
  | 11278781 | myuser  | 192.168.0.200:1091 | mydb   | Sleep   |   85 |       | NULL             |
  | 11278805 | myuser  | 192.168.0.200:1092 | mydb   | Sleep   |   76 |       | NULL             |
  | 11278860 | myuser  | 192.168.0.200:1093 | mydb   | Sleep   |   73 |       | NULL             |
  | 11278877 | myuser  | 192.168.0.200:1094 | mydb   | Sleep   |   66 |       | NULL             |
  | 11278898 | myuser  | 192.168.0.200:1099 | mydb   | Sleep   |   54 |       | NULL             |
  | 11278913 | myuser  | 192.168.0.200:1100 | mydb   | Sleep   |   46 |       | NULL             |
  | 11278935 | myuser  | 192.168.0.200:1101 | mydb   | Sleep   |   42 |       | NULL             |
  | 11303229 | myuser  | 192.168.0.200:1833 | mydb   | Sleep   |    3 |       | NULL             |
  | 11307621 | myuser  | 192.168.0.200:2006 | mydb   | Sleep   |  161 |       | NULL             |
  | 11307953 | myuser  | 192.168.0.200:2028 | mydb   | Sleep   |   93 |       | NULL             |
  | 11307998 | myuser  | 192.168.0.200:2029 | mydb   | Sleep   |   76 |       | NULL             |
  | 11308004 | myuser  | 192.168.0.200:2030 | mydb   | Sleep   |   74 |       | NULL             |
  | 11308244 | myuser  | 192.168.0.200:2038 | mydb   | Sleep   |  147 |       | NULL             |
  | 11308349 | myuser  | 192.168.0.200:2044 | mydb   | Sleep   |  132 |       | NULL             |
  | 11308350 | myuser  | 192.168.0.200:2045 | mydb   | Sleep   |  127 |       | NULL             |
  | 11308387 | myuser  | 192.168.0.200:2051 | mydb   | Sleep   |  126 |       | NULL             |
  | 11308416 | myuser  | 192.168.0.200:2052 | mydb   | Sleep   |  119 |       | NULL             |
  | 11308454 | myuser  | 192.168.0.200:2053 | mydb   | Sleep   |   71 |       | NULL             |
  | 11308460 | myuser  | 192.168.0.200:2054 | mydb   | Sleep   |   98 |       | NULL             |
  | 11308487 | myuser  | 192.168.0.200:2055 | mydb   | Sleep   |   44 |       | NULL             |
  | 11308498 | myuser  | 192.168.0.200:2056 | mydb   | Sleep   |   23 |       | NULL             |
  | 11308542 | myuser  | 192.168.0.200:2057 | mydb   | Sleep   |   13 |       | NULL             |
  | 11308560 | myuser  | 192.168.0.200:2058 | mydb   | Sleep   |   10 |       | NULL             |
  | 11308682 | myuser  | server5:5190       | NULL   | Sleep   |  117 |       | NULL             |
  | 11308722 | myuser  | server5:51903      | mydb   | Query   |    0 | NULL  |       show processlist |
        +----------+---------+--------------------+--------+---------+------+-------+------------------+
  40 rows in set
  

这正常吗?

问题好像说清楚了,报错说:

System.Net.Sockets.SocketException: An operation on a socket could not be performed because the system lacked sufficient buffer space or because a queue was full.

造成这种情况的原因可能有多种(您可以 google 它)但通常是因为缺少硬件、缺少服务器更新、过时的更新,或者您没有在连接上释放对象,或者不要关闭连接,内存不足,资源不足,但定义:您正在使用很多端口。

你可以试试这个:

在 Windows 服务器 2008 R2 上 打开命令提示符

键入以下内容 netsh int ipv4 set dynamicport tcp start=10000 num=50000 按 Enter

键入以下内容 netsh int ipv4 set dynamicport udp start=10000 num=50000 按 Enter

键入以下内容 netsh int ipv6 set dynamicport tcp start=10000 num=50000 按 Enter

键入以下内容 netsh int ipv6 set dynamicport udp start=10000 num=50000 按 Enter

更多信息请访问: http://web.archive.org/web/20160118151510/http://blogs.technet.com/b/askds/archive/2008/10/29/port-exhaustion-and-you-or-why-the-netstat-tool-is-your-friend.aspx

https://blog.whitesites.com/blog.aspx?key=635140180116307813