Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 大型站点上的Sloq SQL执行(调用存储过程)_C#_Sql_Asp.net_Sql Server_Stored Procedures - Fatal编程技术网

C# 大型站点上的Sloq SQL执行(调用存储过程)

C# 大型站点上的Sloq SQL执行(调用存储过程),c#,sql,asp.net,sql-server,stored-procedures,C#,Sql,Asp.net,Sql Server,Stored Procedures,首先,我意识到我的问题可能是广泛的,请容忍我,因为我已经思考了一个月如何形成它,我仍然不能100%确定如何表达我的问题 我目前正在开发一个网站,每天将有成千上万的用户使用。瓶颈是与数据库的通信 与表的每一次对话都是通过存储过程完成的,存储过程的调用如下所示: public void storedProcedure(int id, out DataSet ds) { ds = new DataSet("resource"); SqlDataReader objReader

首先,我意识到我的问题可能是广泛的,请容忍我,因为我已经思考了一个月如何形成它,我仍然不能100%确定如何表达我的问题

我目前正在开发一个网站,每天将有成千上万的用户使用。瓶颈是与数据库的通信

与表的每一次对话都是通过存储过程完成的,存储过程的调用如下所示:

    public void storedProcedure(int id, out DataSet ds)
{
    ds = new DataSet("resource");

    SqlDataReader objReader = null;
    SqlCommand cmd = new SqlCommand("storedProcedure", DbConn.objConn);
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.Add(new SqlParameter("@id", id));

    openConnection(cmd);

    SqlDataAdapter objDataAdapter = new SqlDataAdapter();
    objDataAdapter.SelectCommand = cmd;

    objDataAdapter.Fill(ds);

    cmd.Connection.Close();
}

我的对象定义如下:

    public static string DatabaseConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["objConnLocal"].ConnectionString;
public static SqlConnection objConn = new SqlConnection(DatabaseConnectionString);
当然,在web.config中我有

<add name="objConnLocal" connectionString="Initial Catalog=t1;Data Source=1.2.3.4;Uid=id;pwd=pwd;Min Pool Size=20;Max Pool Size=200;" providerName="SQLOLEDB.1"/>
这使得连接速度变慢,但至少没有显示YSOD

那么,我在SQL调用上做错了什么,以至于只有5-10个用户的SQL调用速度如此之慢?到目前为止,我所拥有的: 我在Stack Overflow上读到,使用“using”是非常好的,但我不完全确定为什么会这样,因为它是答案下的一行注释。另一个改进的想法是使用多个连接字符串,而不仅仅是一个

决议:

将连接字符串中建立连接的等待时间从username/pwd更改为integratedsecurity解决了该问题。如果任何人有类似问题,请参阅

现在的问题是:在每个页面上加载几个sp调用(如上所述),然后 当用户开始浏览页面时,会发出更多的调用

这听起来像是您编写的网页,在存储过程调用完成之前不会显示任何内容。这绝不是一个好主意

将这些SP调用转移到后台线程中,这样用户在进入网页时至少可以看到一些内容(如“请稍候”消息)。这也有助于防止超时消息

还有一件事:你没有说为什么你的SP需要这么长时间才能运行

如果您正在处理大量记录,那么运行SQL脚本(在下面的链接中描述)来检查缺少的SQL Server索引是值得的

该脚本显示了对用户影响最大的缺失索引,还告诉您需要运行createindex命令来添加这些索引的语法

现在的问题是:在每个页面上加载几个sp调用(如上所述),然后 当用户开始浏览页面时,会发出更多的调用

这听起来像是您编写的网页,在存储过程调用完成之前不会显示任何内容。这绝不是一个好主意

将这些SP调用转移到后台线程中,这样用户在进入网页时至少可以看到一些内容(如“请稍候”消息)。这也有助于防止超时消息

还有一件事:你没有说为什么你的SP需要这么长时间才能运行

如果您正在处理大量记录,那么运行SQL脚本(在下面的链接中描述)来检查缺少的SQL Server索引是值得的


此脚本显示了对用户影响最大的缺失索引,还告诉您需要运行CREATE INDEX命令来添加这些索引的语法。

您说得对-这是一个广泛的问题

对于上下文来说,从性能的角度来看,许多“每天数千用户”并不是很大。一个构建良好的ASP.Net应用程序通常可以在一台适当指定的开发人员笔记本电脑上支持数百个并发用户;假设每天有10000个用户,那么在高峰时间,您可能只有几十个并发用户(当然,这完全取决于应用程序域)

要做的第一件事是对正在运行的代码使用探查器来查看性能瓶颈在哪里。这是,有几个第三方解决方案(我喜欢RedGate和JetBrains)

分析器将告诉您代码的速度慢的地方-如果页面渲染需要几秒钟,这应该是非常明显的


乍一看,数据库似乎有问题。因此,您还可以使用来查看长时间运行的查询。

您是对的-这是一个广泛的问题

对于上下文来说,从性能的角度来看,许多“每天数千用户”并不是很大。一个构建良好的ASP.Net应用程序通常可以在一台适当指定的开发人员笔记本电脑上支持数百个并发用户;假设每天有10000个用户,那么在高峰时间,您可能只有几十个并发用户(当然,这完全取决于应用程序域)

要做的第一件事是对正在运行的代码使用探查器来查看性能瓶颈在哪里。这是,有几个第三方解决方案(我喜欢RedGate和JetBrains)

分析器将告诉您代码的速度慢的地方-如果页面渲染需要几秒钟,这应该是非常明显的


乍一看,数据库似乎有问题。因此,您还可以使用查看长时间运行的查询。

我将阅读分析程序以进行设置,谢谢。活动监视器可能也会有很大帮助!我终于找到了问题所在。我们有一个程序在15-25秒的时间里被破坏了,网站正在超时,等待它。现在主要的问题是我们在连接字符串中使用了user_id和password来连接数据库,因此对于所有用户,总共有200个连接。如果我们没有长时间运行的SQL,这几乎不会是一个问题。但自从我们这样做之后,我们引入了集成的安全性——为每个用户都提供了一个新的连接池,因为上面的所有问题都消失了。你仍然在谈论少量的用户。20个连接-哇哈。认真地修复损坏的存储过程。它不应该花费15-25秒——不知为什么我认为数据库程序员犯了初学者的错误。缺少索引,不可压缩的sql,诸如此类的东西。解决这个问题。我会阅读档案来设置它的。谢谢。活动监视器可能也会有很大帮助!我终于找到了问题所在。我们有一个程序,在15-25秒的时间里被破坏了,网站超时了,等等
<add name="objConnLocal" connectionString="Initial Catalog=t1;Data Source=1.2.3.4;Uid=id;pwd=pwd;Min Pool Size=20;Max Pool Size=200;" providerName="SQLOLEDB.1"/>
private void openConnection(SqlCommand cmd){

    if (cmd.Connection.State != ConnectionState.Closed)
    {
        cmd.Connection.Close();
    }

    if (cmd.Connection.State == ConnectionState.Open)
    {
        cmd.Connection.Close();
    }
    try
    {
        cmd.Connection.Open();
    }
    catch (Exception ex)
    {
        System.Threading.Thread.Sleep(1000);
        HttpContext.Current.Response.Redirect("/");
    }
}