问题描述:
环境:iis + sqlserver;用c#开发的web程序;大部分功能都是查询功能,而且查询语句都是写的存储过程
问题:在实际运行过程中,过一天左右就会出现连接超时的错误;经过测试发现,当使用一个用户的时候
基本上没有问题,当使用多个用户进行测试的时候,在大约100次迭代内会出现连接超时,然后所有执行
存储过程的功能都出现连接超时的错误,而不使用存储过程的功能都可以照常使用。
执行存储过程的语法大致如下:DataSet ds=new DataSet();
SqlDataAdapter da=new SqlDataAdapter("up_procedure 'p1','p2'",conn);
da.Fill(ds,"Table");然后把ds与datagrid绑定进行显示

解决方案 »

  1.   

    问题描述非常清楚明白,难得看见,呵呵。检查所有不是使用SqlDataAdapter 的地方(比如用SqlDataReader),看看是否有连接未及时关闭的分支。(if-else分支,try-catch分支等都是容易犯错的地方)检查所有需要长执行时间(超过半秒)的存储过程调用,看看代码中是否在这些环节存在考虑不周的情况。SqlServer和系统本身的问题(比如没有正常安装等)。由于信息有限,只能根据以往经验给你一些猜测。另外注意在超时发生时(前、后)服务器的CPU和内存使用情况,以及发生是否有规律性可寻。程序都已经到最后测试阶段了,做结构上的变更代价太大,建议下次把数据库操作好好封一下,起码出了问题很容易找。
      

  2.   

    我估计不是连接没有关闭的情况,一个是我已经把测试缩小到了两个页面,而且都仔细检查过了;二是当出现连接超时的时候,都是执行存储过程的页面,而直接执行SQL语句的页面依然很好,这些语句也在使用同样的数据库连接。
    另外在出现这种情况的时候对CPU和内存也做了检查,发现并没有异常。
    存储过程比较复杂点,我今天也仔细检查检查,看看有没有问题。当出现这种情况的时候,数据库本身没有一点问题,依然可以执行任何操作。
      

  3.   

    当数据库连接超时的时候,我使用另外一台服务器(web)却没有问题,说明数据库依然好好的呢
      

  4.   

    今天在现场还出现了另外一个问题,就是在使用一段时间后,出现sql server不存在或者拒绝访问,当重新启动IIS后,问题解决。不过在测试环境中,我还没有测试到。
      

  5.   

    用profiler和perf monitor看看sql server以及web server的performance
      

  6.   

    给以一个建议
    CommandTimeout 值加大或干脆设置为0
    不过找到具体问题是解决问题的关键
      

  7.   

    profiler和perf monitor,这两个工具还不清楚怎么用,还请详细说明一下
      

  8.   

    下面是具体的错误信息。“/dlx”应用程序中的服务器错误。
    --------------------------------------------------------------------------------请求已超时。 
    说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.Web.HttpException: 请求已超时。源错误: 执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪信息确定有关异常原因和发生位置的信息。  堆栈跟踪: 
    [HttpException (0x80004005): 请求已超时。] 
      

  9.   

    private void GetData_All()
    {
    // SqlCommand cmd=new SqlCommand("up_sale_province_cust '"+user_id+"'",db.GetFixCon(1));
    // cmd.CommandTimeout=600;
    // SqlDataAdapter da=new SqlDataAdapter(cmd);
    // DataTable dt=new DataTable();
    // da.Fill(dt); db.GetFixCon(1); DataTable dt=db.ExecSp("up_sale_province_cust",new object[1]{user_id}).Tables[0];
    db.Close(); Session["source_pro_all"]=dt;

    //合计行
    if(dt.Rows.Count>0)
    {
    decimal sale=0;
    decimal arr=0;
    sale=Convert.ToDecimal(dt.Compute("sum(sale)","sale not is null"));
    arr=Convert.ToDecimal(dt.Compute("sum(arr)","arr not is null"));
    this.Td10.InnerText=sale.ToString("C");
    this.Td11.InnerText=arr.ToString("C");
    }


    }