1、网站的每天访问量很大。
2、运行几天后网站运行速度很慢。
3、查看任务管理器,发现此时任务管理器中的Mem Usage项,数据增长很快。
4、出现这个问题后,大约两个小时后,会自动好了。
5、有时候重启服务器,也不管用,Mem Usage项依然增长很快。
6、只要Mem Usage稳定了,网站访问就正常了。PS:程序使用了SQLHelper.cs;session、cache几乎没怎么用。大家有遇到过这种问题吗,请教高手指教,谢了

解决方案 »

  1.   

    不是使用了什么,是你有许多,SQL连接,打开没关闭,占用的资源没清空,
    记住,有打开,就要有关闭,
      

  2.   

    我这个站点,涉及到数据操作最多的就是往数据库里写数据(每天大约有80万次左右)
    其他操作就是一些简单的查询,使用频率很低下面是我往数据库里写数据的程序
    using (SqlConnection Conn = new SqlConnection(ConnString))
    {
        Conn.Open();
        using (SqlTransaction Tran = Conn.BeginTransaction())
        {
          try
          {
             //SQL for Insert
          }
          catch
          {
             Tran.Rollback();
          }
          finally
          {
             Conn.Close();
             Conn.Dispose();
          }
         }
    }
      

  3.   

    menglingjun:是在Conn.Open();处这样写吗?if (Conn.State == ConnectionState.Closed)
    {
    Conn.Open();
    }
      

  4.   

    这个要从多方面来看了,
    你的服务器是什么级别的?什么级别就可以来处理什么量级的访问。代码的问题上要看是慢在数据库层了还是慢在应用层,这个很关键,你判断不出来就无法解决。还有就是看看能不能用WEB GARDEN技术来分散压力。
      

  5.   

    你可以这样写代码:protected void Button1_Click(object sender, EventArgs e)
    {
        System.Threading.ThreadPool.QueueUserWorkItem(myTask);
    }private void myTask(object obj)
    {
        using (SqlConnection Conn = new SqlConnection(ConnString))
        {
            Conn.Open();
            //SQL for Insert
        }
    }另外,如果你只是执行一个SqlCommand对象,那么SqlTrsanction完全是多余的,SqlServer会自动为每一条命令创建一个事务。另外,Using(){...}完全不应该画蛇添足地写try...catch...finally。
      

  6.   

    不过“每天大约有80万次左右”还是比较繁忙的(每秒钟20个事务),如果没有一个非常棒的服务器还是不太秒。应该考虑是不是将数据库服务器从web服务器分离出去。
      

  7.   

    另外,尽可能避免你的那些查询操作额外地重复访问数据库,应该对常用的查询结果依据其SQL查询语句作为key进行缓存。
      

  8.   

    目前数据库服务器和web服务器就是分离的
    web服务器 内网链接 数据库服务器
      

  9.   

    sp1234:
    QueueUserWorkItem方法都有啥好处,能有效的提升我程序的性能不,再来对资源释放有作用吗?
    还有myTask方法体中,Conn.Open();之前需要加
    Conn.State == ConnectionState.Closed这个判断不?
    谢了
      

  10.   

    80万次 已经很厉害了,如果有个全局变量的话 你这服务器我估计也要爆了,还有你这连接一看就有问题了,必须处理好打开的问题,你80万次 肯定有 这个还没关闭 下一个就又开始打开执行了,不知道你是不是用存储过程来写SQL的,要是你用参数写SQL的话我估计服务器代码量也会有问题。
      

  11.   

    80万次肯定存在并发的情况 肯定要加 Conn.State == ConnectionState.Closed 这个 判断
      

  12.   

    关于SqlTrsanction,我的入库操作都是用存储过程实现的,存储过程里也加了事务处理,程序的SQL for Insert部分,也就是调用我的存储过程
    这种情况,在程序里加SqlTrsanction是不是多余呀!
      

  13.   

    总结:
    1、使用QueueUserWorkItem来执行我的处理程序
    2、用using来创建SqlConnection,去掉try、catch、finally语句。
    3、添加Conn.State == ConnectionState.Closed判断,来决定是否Conn.Open()。
    4、去掉SqlTrsanction部分。
      

  14.   

    SqlDataReader用的太多了,
    建议楼主
    在数据量小,使用又非常多的地方,使用DataSet,
      

  15.   

    Linux7985:我程序里很少用到SqlDataReader的
      

  16.   

    连接数据库那块,你从网上下一个比较好的类库,你写的问题多多,ado.net那块
      

  17.   

    jie7359:ado.net这块,你有啥好的推荐吗?谢谢
      

  18.   

    怎么只有开始事务,没有提交事务呢?
    在连接关闭之前,提交事务:
    Tran.Commit ();
      

  19.   

    SQL连接,打开没关闭,占用的资源没清空,
    记住,有打开,就要有关闭,一定要资源释放的。