2017-12-22 22 views
0

私は非常に不満な問題を期待しており、理由を見つけることができません。タイムアウトが切れました - >指定されたMySQLホストに接続できません

AzureにホストされているMySQLデータベースを使用するアプリがあります。私はOracle(6.10.5)からMySQL.Data nugetを使用しています。 非常に頻繁に、Unableが指定されたMySQLホスト(24時間ごとにダース)に接続するとタイムアウト期限切れのエラーが発生します。

Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. 
Exception Details: MySql.Data.MySqlClient.MySqlException: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. 

スタックトレース:

[MySqlException (0x80004005): Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.] 
    MySql.Data.Common.StreamCreator.GetTcpStream(MySqlConnectionStringBuilder settings) +177 
    MySql.Data.Common.StreamCreator.GetStream(MySqlConnectionStringBuilder settings) +37 
    MySql.Data.MySqlClient.NativeDriver.Open() +55 

[MySqlException (0x80004005): Unable to connect to any of the specified MySQL hosts.] 
    MySql.Data.MySqlClient.NativeDriver.Open() +151 
    MySql.Data.MySqlClient.Driver.Open() +50 
    MySql.Data.MySqlClient.Driver.Create(MySqlConnectionStringBuilder settings) +225 
    MySql.Data.MySqlClient.MySqlPool.CreateNewPooledConnection() +15 
    MySql.Data.MySqlClient.MySqlPool.GetPooledConnection() +288 
    MySql.Data.MySqlClient.MySqlPool.TryToGetDriver() +93 
    MySql.Data.MySqlClient.MySqlPool.GetConnection() +65 
    MySql.Data.MySqlClient.MySqlConnection.Open() +629 
    SalesManager.Models.ConnectionClass.QueryExec() in C:\Users\Gabinet\Source\Repos\SalesManager\SalesManager\SalesManager\Models\Data\ConnectionClass.cs:39 
    SalesManager.Models.ProductDownload.GetStorageQuantity(Int32 id) in C:\Users\Gabinet\Source\Repos\SalesManager\SalesManager\SalesManager\Models\ProductDownload.cs:58 
    SalesManager.Controllers.SalesController.Index(String sortOrder, String df, String dt) in C:\Users\Gabinet\Source\Repos\SalesManager\SalesManager\SalesManager\Controllers\SalesController.cs:41 
    lambda_method(Closure , ControllerBase , Object[]) +194 
    System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) +19 
    System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +169 
    System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +27 
    System.Web.Mvc.Async.AsyncControllerActionInvoker.<BeginInvokeSynchronousActionMethod>b__39(IAsyncResult asyncResult, ActionInvocation innerInvokeState) +24 
    System.Web.Mvc.Async.WrappedAsyncResult`2.CallEndDelegate(IAsyncResult asyncResult) +31 
    System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +50 
    System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult) +33 
    System.Web.Mvc.Async.AsyncInvocationWithFilters.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3d() +50 
    System.Web.Mvc.Async.<>c__DisplayClass46.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3f() +228 
    System.Web.Mvc.Async.<>c__DisplayClass33.<BeginInvokeActionMethodWithFilters>b__32(IAsyncResult asyncResult) +15 
    System.Web.Mvc.Async.WrappedAsyncResult`1.CallEndDelegate(IAsyncResult asyncResult) +15 
    System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +50 
    System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethodWithFilters(IAsyncResult asyncResult) +35 
    System.Web.Mvc.Async.<>c__DisplayClass2b.<BeginInvokeAction>b__1c() +26 
    System.Web.Mvc.Async.<>c__DisplayClass21.<BeginInvokeAction>b__1e(IAsyncResult asyncResult) +100 
    System.Web.Mvc.Async.WrappedAsyncResult`1.CallEndDelegate(IAsyncResult asyncResult) +15 
    System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +50 
    System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) +29 
    System.Web.Mvc.Controller.<BeginExecuteCore>b__1d(IAsyncResult asyncResult, ExecuteCoreState innerState) +15 
    System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +29 
    System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +50 
    System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +36 
    System.Web.Mvc.Controller.<BeginExecute>b__15(IAsyncResult asyncResult, Controller controller) +14 
    System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +22 
    System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +50 
    System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +27 
    System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult) +12 
    System.Web.Mvc.MvcHandler.<BeginProcessRequest>b__5(IAsyncResult asyncResult, ProcessRequestState innerState) +21 
    System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +29 
    System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +50 
    System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +29 
    System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +11 
    System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +577 
    System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +157 

Azureのアプリケーションの洞察は、タイムアウトを与える:

Event code: 3005 

Event message: An unhandled exception has occurred. 

Event time: 22/12/2017 14:40:56 

Event time (UTC): 22/12/2017 14:40:56 

Event ID: 503190c80af54cdb87140fe1f808de22 

Event sequence: 16 

Event occurrence: 5 

Event detail code: 0 



Application information: 

    Application domain: /LM/W3SVC/41351921/ROOT-1-131584264107173868 

    Trust level: Full 

    Application Virtual Path:/

    Application Path: D:\home\site\wwwroot\ 

    Machine name: RD00155D58C141 



Process information: 

    Process ID: 10784 

    Process name: w3wp.exe 

    Account name: IIS APPPOOL\xxxx 



Exception information: 

    Exception type: MySqlException 

    Exception message: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. 
    at MySql.Data.Common.StreamCreator.GetTcpStream(MySqlConnectionStringBuilder settings) 
    at MySql.Data.Common.StreamCreator.GetStream(MySqlConnectionStringBuilder settings) 
    at MySql.Data.MySqlClient.NativeDriver.Open() 





Request information: 

    Request URL: http://xxxxx.azurewebsites.net/ 

    Request path:/

    User host address: xx.xxx.xxx.xx 

    User: xxxxx 

    Is authenticated: True 

    Authentication Type: ApplicationCookie 

    Thread account name: IIS APPPOOL\xxxx 



Thread information: 

    Thread ID: 35 

    Thread account name: IIS APPPOOL\xxxx 

    Is impersonating: False 

    Stack trace: at MySql.Data.Common.StreamCreator.GetTcpStream(MySqlConnectionStringBuilder settings) 
    at MySql.Data.Common.StreamCreator.GetStream(MySqlConnectionStringBuilder settings) 
    at MySql.Data.MySqlClient.NativeDriver.Open() 

私は私のローカルマシン上でこのエラーをトリガすることはできません。 AzureからMySqlデータベースにpingを実行できます。 資格情報は問題ありません。ローカルマシンで正常に動作します。

Connectionクラス:

public static int GetStorageQuantity(int id) 
{ 
    if (id != 9999) 
    { 
     connection = new ConnectionClass(); 
     string sql = "select quantity from ps_stock_available where id_product = @pId"; 
      connection.MySqlQueryWithParam(sql, "@pId", id.ToString()); 
      var dr = connection.QueryExec().Rows[0]; 
      var quantity = Convert.ToInt32(dr["quantity"].ToString()); 
      return quantity; 
    } 
    return 0; 
} 

私の推測では、私は私が精通していないよ、接続プールに関連する何かが欠けていることを次のようになります。失敗した

using System; 
using System.Collections.Generic; 
using System.Data; 
using System.Data.SqlClient; 
using System.Linq; 
using System.Web; 
using MySql.Data.MySqlClient; 

namespace SalesManager.Models 
{ 
    public class ConnectionClass : IDisposable 
    { 
     private MySqlConnection _con; 
     private MySqlCommand _cmd; 
     private MySqlDataAdapter _da; 
     private DataTable _dt; 

     private string _constr = 
      "Server=mysqldb.com; Database=databaseName; Uid=database_user; Pwd=database_pass; Default Command Timeout=300000; "; 

     public ConnectionClass() 
     { 
      _con = new MySqlConnection(_constr); 
     } 

     public void MySqlQuery(string sqlquery) 
     { 
      _cmd = new MySqlCommand(sqlquery, _con); 
     } 

     public void MySqlQueryWithParam(string sqlquery, string paramName, string paramValue) 
     { 
      _cmd = new MySqlCommand(sqlquery, _con); 
      _cmd.Parameters.AddWithValue(paramName, paramValue); 
     } 

     public DataTable QueryExec() 
     { 
      _con.Open(); 
      _da = new MySqlDataAdapter(_cmd); 
      _dt = new DataTable(); 
      _da.Fill(_dt); 
      _con.Dispose(); 
      return _dt; 
     } 

     public void NonQueryExec() 
     { 
      _con.Open(); 
      _cmd.ExecuteNonQuery(); 
      _con.Dispose(); 
     } 

     public void Dispose() 
     { 
      _con.Close(); 
      _con.Dispose(); 
     } 
    } 
} 

方法。

何が原因だろうと思いますか?他に何が確認できますか?

お手数をおかけします。このような場合には、それはよくあなたの使い捨てのものを使用して開始、常に価値

答えて

0

です...

using (var connection = new ConnectionClass()) { 
    //... 
} 

あなたがGCのコールのみ閉鎖されている、あまりにも多くの接続を、作っている可能性がありますdisposeメソッドusingステートメントは接続を早期に終了するため、問題が解決する可能性があります。

他の要因によっても問題が発生する可能性がありますが、多くの同様の問題を解決するために意図的に接続を閉じることがわかりました。

+0

前回のConnectionClassの繰り返しで "using"を使用していて、同じ問題が予想されていました。しかし、もう一度やり直します。ありがとう – beribazoo

+0

まったく同じエラーです。私はなぜそれがローカルマシンで動作し、Azureで失敗するのか理解できません。 – beribazoo

+0

Azureで動作するかどうか、つまり間欠的か、毎回ですか? – Fenton

関連する問題