3

Informix データベース クエリを処理する接続クラスがあります。2 つの機能があります。1 つは単純なクエリを実行するためのもので、もう 1 つはデータテーブルを返すためのものです。断続的に (特に、セッションを 10 分間など少しの間放置すると)、新しい情報を要求すると、conn.open コマンドで、放棄されたミューテックス エラーが発生します。

問題のコードは次のとおりです。

public DataTable CallDtQuery(string query)
{
  DataTable dt = new DataTable();
  using (IBM.Data.Informix.IfxConnection conn = new
         IBM.Data.Informix.IfxConnection(sqlConnection))
  {
    try
    {
      IBM.Data.Informix.IfxDataAdapter adapter = new IfxDataAdapter();
      adapter.SelectCommand = new IBM.Data.Informix.IfxCommand(query, conn);
      conn.Open();  //Error location.
      adapter.Fill(dt);
      conn.Close();
    }
    catch (IBM.Data.Informix.IfxException ex)
    {
      LogError(ex, query);
      SendErrorEmail(ex, query);
      DisplayError();
    }
  }
  return dt;
}

さらに、データベースに接続するアプリケーションで唯一の他の関数である単純なクエリ関数を次に示します。

public string CallSimpleQuery(string query, string command)
{
  string result = "";
  using (IBM.Data.Informix.IfxConnection conn = new
         IBM.Data.Informix.IfxConnection(sqlConnection))
  {
    try
    {
      IBM.Data.Informix.IfxDataAdapter adapter = new IfxDataAdapter();
      conn.Open();
      switch (command)
      {
        case "UPDATE":
          adapter.UpdateCommand = new IBM.Data.Informix.IfxCommand(query, conn);
          result = adapter.UpdateCommand.ExecuteNonQuery().ToString();
          break;
        case "DELETE":
          adapter.DeleteCommand = new IBM.Data.Informix.IfxCommand(query, conn);
          result = adapter.DeleteCommand.ExecuteNonQuery().ToString();
          break;
        case "SELECT":
          adapter.SelectCommand = new IBM.Data.Informix.IfxCommand(query, conn);
          result = adapter.SelectCommand.ExecuteScalar().ToString();
          break;
        case "INSERT":
          adapter.InsertCommand = new IBM.Data.Informix.IfxCommand(query, conn);
          result = adapter.InsertCommand.ExecuteNonQuery().ToString();
          break;
        }
        conn.Close();
      }
      catch (IBM.Data.Informix.IfxException ex)
      {
        LogError(ex, query);
        SendErrorEmail(ex, query);
        DisplayError();
      }
    }
    return result;
  }

生成されたエラーは次のとおりです。

Error Message = The wait completed due to an abandoned mutex.
Message Source:
mscorlib
=============================
Message Target:
Boolean WaitOne(Int64, Boolean)
=============================
Stack Trace:
  at System.Threading.WaitHandle.WaitOne(Int64 timeout, Boolean exitContext)
  at System.Threading.WaitHandle.WaitOne(Int32 millisecondsTimeout, Boolean exitContext)
  at System.Threading.WaitHandle.WaitOne()
  at IBM.Data.Informix.IfxConnPoolManager.GetPool(IfxConnSettings key)
  at IBM.Data.Informix.IfxConnPoolManager.Open(IfxConnection connection)
  at IBM.Data.Informix.IfxConnection.Open()
  at XXX.Connections.CallDtQuery(String query) in d:\Inetpub\wwwroot\intranet\CWSheet-test2\App_Code\Connections.cs:line 75
  at XXX.details.Page_Load(Object sender, EventArgs e) in d:\Inetpub\wwwroot\intranet\CWSheet-test2\Details.aspx.cs:line 29
  at System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e)
  at System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e)
  at System.Web.UI.Control.OnLoad(EventArgs e)
  at System.Web.UI.Control.LoadRecursive()
  at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

エラーが発生すると、catch ブロックに入って Log、Send、および Display エラー関数を実行する代わりに、global.asax の Application_Error ブロックにドロップされます。すべてが try/catch ブロック内にラップされているため、何が原因なのかわかりません。さらに、何らかの理由でアプリケーションが CallDtQuery でハングアップすることがあります。フォームビューでレコードのページをめくると、CallDtQuery 要求で突然ハングします。1 ~ 2 分後に処理が完了する場合もあれば、30 分後にアプリケーションがタイムアウトするまで無期限に停止する場合もあります。

ミューテックスについて少し読んでいますが、これまで使用したことがありません。使用されているミューテックスは、ASP.NET アプリケーションによって自動的に生成されます。それを念頭に置いて、この問題をトラブルシューティングまたは解決する方法がよくわかりません。助言がありますか?

4

2 に答える 2

1

したがって、問題は私が使用していた IBM.Data.Informix.dll バージョン (2.90) にあったことが判明しました。 cgi/読み取り/109

新しいバージョン (3.50) に更新すると、Abandoned Mutex エラーはなくなりました。断続的なハングの問題も解消されました。

于 2013-02-19T14:42:24.743 に答える