asp.net - 请求经常超时

标签 asp.net performance .net-3.5 iis-7.5 informix

我一次又一次地遇到以下问题,我不知道该如何解决..

我经常收到以下错误,我不得不restart the IISrepublish临时解决了问题:

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)

我的页面加载:
 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)
            {
            }

        }

最佳答案

这是推测,因为从问题中发布的代码片段中看不到很多引用的代码。

我将基于以下几个原因来假设您未正确处理数据库连接(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()。通常,这是通过采用保存上下文的类并使其实现IDisposable,然后使用using语句包装对该类的所有调用来实现的。 using语句将自动调用Dispose方法。如果您不想执行IDisposable,则在查询完成后,还可以通过直接在连接上直接调用.Dispose()来显式(不建议)处置数据库连接。

编辑以响应新添加的评论:

@just_name-从注释中的代码看来,在我看来可能是一个问题。对我来说,依靠~DBConnection()来处理您的连接,仅调用.Close()而不关闭流即可。

i)终结器可能需要很长时间

使用终结器处理连接可能会有风险,因为您无法确切确定何时调用该连接。 “终结器在垃圾回收期间执行的确切时间是不确定的。” -MSDN Object.Finalize。如果它有很多资源,这可能导致系统等待很长时间,然后再丢弃任何连接,从而减慢了请求的速度。

iit_strong ii)关闭未处理

尽管从技术上讲,在连接上调用.Close()是安全的,但它可能会在生产中引起问题。原因是连接将关闭,但事件处理程序将保留,有时,如果涉及延迟加载或动态代理,则这些事件处理程序可以保存连接的副本。

iii)使用Dispose

a)明确处置您的连接

始终明确处理您的连接,不要等待垃圾收集器执行此操作。处置它的最佳实践方法是在访问using(){}类时使用DBConnection块。您可以进行一些更改以执行此操作:

定义DBConnection来实现IDisposable,以便可以在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(){}块。我注意到您可以在一个地方专门用必须处理的代码流来实现这一点。

这是令人讨厌的代码之一:
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"]; 
 } 
}

关于asp.net - 请求经常超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11290643/

相关文章:

asp.net - 为什么当我 float 列表元素时列表的背景颜色消失了?

Java 无法及时收集垃圾

c# - 无法使用 C# ConfigurationManager

c# - 使用 LINQ 创建增量值的 IEnumerable<>

ASP.NET 网站与 ASP.NET WebApp : What's the performance difference?

javascript - 使用 javascript 和 jquery 计算 gridview 单元格总数时出现错误

performance - 使用 OPC 标签提高性能

java - 缓冲区大小如何影响 NIO channel 性能?

.net-3.5 - 本地化 IEnumerable 的最佳方法是什么?

c# - 表之间的关系