5

私は何度も次の問題に直面し、それを修正する方法がわかりません..

次のエラーが頻繁に発生します。問題を一時的に修正するrestart the IIS必要がありました。republish

Error Message:Request timed out.
Error Message:ERROR [08S01] [Informix .NET provider]Communication link failure.
Error Message:Thread was being aborted.

私は作ろうとします:

<httpRuntime executionTimeout="600" />

しかし、それでも同じ問題!!


Stack Trace:
   at System.Web.HttpContext.InvokeCancellableCallback(WaitCallback callback, Object state)
   at System.Web.UI.Page.AsyncPageBeginProcessRequest(HttpContext context, AsyncCallback callback, Object extraData)
   at ASP.appmaster_aspx.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object data)
   at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
   at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

私のPageLoad:

 protected void Page_Load(object sender, EventArgs e)
        {


            if (Session["emp_num"] != null && !string.IsNullOrEmpty(Session["emp_num"].ToString()))
            {
                try
                {

                    string user_setting = Personalization_DAL.CheckWidgetSettings(int.Parse(Session["emp_num"].ToString()));

                    if (!string.IsNullOrEmpty(user_setting))
                    {
                        user_flag = int.Parse(user_setting);
                    }

                    GetLinkedApp = DB_Connection_s.DB_Connection.GetLinkedAppUser(int.Parse(Session["emp_num"].ToString()));
                    if (!Page.IsPostBack)
                    {
                        //Profile
                        GetProfile();

                        if (Session["emp_app"] != null && !string.IsNullOrEmpty(Session["emp_app"].ToString()))
                        {
                            BindAvailableSystems(Session["emp_app"].ToString());
                        }

                        BindMainSystems();

                        if (GetLinkedApp > 0)
                        {
                            rlv_available_sys.Visible = true;
                            h5_app.Visible = true;
                            lbtn_addApp.Visible = false;
                            h4_app.Visible = false;
                            intro.Visible = true;

                        }
                        else
                        {
                            rlv_available_sys.Visible = false;
                            h5_app.Visible = false;
                            lbtn_addApp.Visible = true;
                            h4_app.Visible = true;
                            intro.Visible = false;
                        }
                        //Applications
                        if (rlv_available_sys.Visible == true)
                        {
                            Session["emp_app"] = GetLinkedApp;
                            BindAvailableSystems(Session["emp_app"].ToString());
                            if (user_flag > 0)
                            {
                                Get_UserApplicationSystems(1, 1, GetLinkedApp.ToString());
                            }
                            else
                            {
                                Get_UserApplicationSystems(user_flag, 1, GetLinkedApp.ToString());
                            }

                        }
                        //services
                        Get_MainSystems(user_flag);
                        if (GetLinkedApp > 0)
                        {
                            GetServiceInformation();
                        }
                        string[] statistics = TrackUser();
                        base.TraceActivity("Enter the portal", "https://" + Request.Url.Authority + "/AppMaster.aspx", statistics[0], statistics[1], statistics[2]);
                    }

                    TraceSystemsMode();
                }
                catch (Exception ee)
                {
                    string message = ee.Message;
                }

            }
            else
            {
                Response.Redirect("LoginPage.aspx", false);
            }
        }

私のジェネリックハンドラー:

public void ProcessRequest(HttpContext context)
        {
            try
            {
                using(Stream photo_stream = Photo_DAL.RetrievePhoto(int.Parse(context.Session["emp_num"].ToString())))
               {
                byte[] photo_bytes = Photo_DAL.StreamToByteArray(photo_stream);
                if (photo_bytes == null)
                {
                    photo_bytes = File.ReadAllBytes(Path.Combine(context.Server.MapPath("~/images/PortalImages/"), "user.png"));
                }
                //context.Response.ContentType = "image/png";
                context.Response.BinaryWrite(photo_bytes);
                }
            }
            catch (Exception ee)
            {
            }

        }
4

4 に答える 4

9

質問に投稿されたスニペットからは確認できない参照コードがたくさんあるため、これは推測です。

DB_Connection_sいくつかの理由で、データベース接続()を適切に処理していないと想定します。

A)リセットで修正

    I get the following errors frequently , and i had to restart the IIS or 
    republish to fix the problem temporary`

私にとって、これは、データベースへのすべての接続を使用していることを示しています。これは、再起動または再公開すると、現在のすべての接続が切断されるためです。

B)明確な処分はありません

コードでは参照しますDB_Connection_sが、usingブロックで囲まれておらず、インスタンス化されていません。つまり、静的クラスまたはメソッドである可能性が高いです(その参照用のコードがないとわかりません)。

提案

データベース接続を常に適切に破棄していることを確認してください。終了時に.Dispose()を呼び出す必要があります。これは通常、コンテキストを保持するクラスを取得して実装し、そのクラスへのすべての呼び出しをusingステートメントでIDisposableラップすることによって実現されます。usingステートメントはメソッドを自動的に呼び出します。実装したくない場合は、クエリが完了したら接続を直接呼び出すことにより、データベース接続が完了したときに明示的に(推奨されませんが)破棄することもできます。DisposeIDisposable.Dispose()

新しく追加されたコメントに応じて編集します。

@just_name-コメントのここにあるコードから、問題がある可能性があるように思われます。接続を破棄することに依存し、ストリームを閉じずに~DBConnection()電話をかけるだけで.Close()、私は目立ちます。

i)ファイナライザーには時間がかかる場合があります

ファイナライザーを使用して接続を破棄すると、いつ呼び出されたかを正確に確認できないため、リスクが伴う可能性があります。「ガベージコレクション中にファイナライザーが実行される正確な時刻は未定義です。」--MSDNObject.Finalize。_ これにより、多くのリソースがある場合、システムが非常に長い時間待機してから、接続が破棄されて要求が遅くなる可能性があります。

ii)閉じることは破棄しない

接続を呼び出すことは技術的に安全ですが.Close()、本番環境で問題が発生する可能性があります。その理由は、接続は閉じますが、イベントハンドラーは残り、遅延読み込みが含まれる場合や動的プロキシがある場合、これらのイベントハンドラーは接続のコピーを保持できる場合があります。

iii)Disposeを使用する

a)接続を明示的に破棄します

常に明示的に接続を破棄してください。ガベージコレクターがそれを実行するのを待たないでください。それを破棄するためのベストプラクティスの方法は、クラスusing(){}にアクセスするときにブロックを使用することです。DBConnectionこれを行うためにいくつかの変更を加えることができます:

IDisposableを実装するようにDBConnectionを定義して、usingブロックで使用できるようにします。

public class DBConnection : IDisposable
{
  //other methods already in here
  public void Dispose()
  {
   //Close_Connection(); Call this if you want, but you MUST call 
   //.Dispose on your connections
   connection.Dispose();
  }
}

これにより、次のような新しいDBConnectionを作成できます。

using( var DB_Connection_s = new DBConnection() )
{
 //todo: interact with database connection
}

.Dispose()ファイナル}に到達すると、 usingブロックが自動的に呼び出し、接続が保証されて破棄されます。さらに、これにより、データベースで発生するトランザクション時間が短くなり、データベースアクセスにキューが含まれている場合に、クエリと要求の速度が向上する可能性があります。

usingブロックの実装が気に入らない場合は、少なくとも、closeを使用するすべての場所に変更.Close()し、データベースアクセスが完了した直後に呼び出さ.Dispose()れない原因となる実行パスがないことを確認してください。.Dispose()

b).Dispose()管理されていないリソースでの使用

.Dispose()管理されていないリソースで常に使用してください。これを行うにはいくつかの方法がありますが、ベストプラクティスの方法はusing(){}ブロックを使用することです。特に、処理する必要のあるコード内のストリームを使用して、これを1か所に実装できることに気付きました。

これは、問題のあるコードの1つです。

IfxDataReader ifxDataReaders = DB_Connection.DBCmd.ExecuteReader(); 
if (ifxDataReaders.Read()) { 
 item = (int)ifxDataReaders["emp_num"]; 
} 
ifxDataReaders.Close();

私はこれに関していくつかの問題を抱えています。.Close()最初に、あなたは上で議論されたものを呼んでいます。次に、これはtryブロック内にあるため、ifxDataReadersが例外をスローし、リーダーを閉じたり破棄したりすることなくプログラムが実行を継続する可能性があります。これは多くの問題を引き起こす可能性があります。

あなたがすべきことは、それがあなたの管理されていないリソースで常に呼び出されることを確実にする.Disposeことですこれは、usingブロック(暗黙的に常に呼び出す.Dispose())を使用して行うことができます。

using(IfxDataReader ifxDataReaders = DB_Connection.DBCmd.ExecuteReader())
{
 if (ifxDataReaders.Read()) { 
  item = (int)ifxDataReaders["emp_num"]; 
 } 
}
于 2012-07-09T23:53:59.350 に答える
2

に属していないことは知っていますError Message:Request timed outが、とのリンクがある可能性がありError Message:Thread was being aborted.ます。したがって、コードサンプルがないためResponse.Redirect("aPage.aspx")、Try-Catchブロック内で作成した場合に問題になる可能性があると考えることができます。

その場合は、次にResponse.Redirect示すように、メソッドのEndResponseパラメーターに「False」を追加してみてください。

try {
    // [... SOME CODE ...]
    Response.Redirect("aPage.aspx", False)
} catch (Exception e) {
    // [... YOUR CATCH ...]
}
于 2012-07-05T20:51:43.857 に答える
2

そこで、タイムアウトを分離するためにパーツを個別に実行することを提案する Zia からのコメントに賛成票を投じました。Informix 接続のエラーである可能性はありますか?

データベース クエリには、接続タイムアウトとコマンド タイムアウトの 2 つのタイムアウトがあります。これらはどちらもexecutionTimeout値を使用しません。Informix プロバイダーを使用したことはありませんが、サーバーがビジー状態の場合、またはコマンド オブジェクトが長い SQL クエリの実行を待機する場合に、接続オブジェクトのタイムアウトを増やしました。

Informix接続オブジェクトでconnectionTimeoutを設定するためのリンクは次のとおりです... http://publib.boulder.ibm.com/infocenter/idshelp/v115/index.jsp?topic=%2Fcom.ibm.net_cc.doc%2Fcom .ibm.swg.im.dbclient.adonet.ref.doc%2Fdoc%2FDB2ConnectionClassConnectionTimeoutProperty.htm

于 2012-07-06T13:53:07.177 に答える
2

主な質問は、なぜそんなに時間がかかるのですか? ページへのヒットに 30 秒以上かかるものがあるのはなぜですか? こんな遅いサイトで本当にライブに行けるの?

リクエストが 30 秒以内に完了するようにパフォーマンスを下げる方法を確認する必要があります。

コードを共有できますか?コードのどこにボトルネックがあるか見てみましょう。

于 2012-07-09T15:08:25.853 に答える