自己做的一个网站,放iis上发布后,网站访问速度还不错。
但是过几个小时,网站访问速度会变的非常慢,重启iis也不行。
但是把iis这个站点删掉,重新建一下站点,访问速度又恢复很快了。
前后访问人数都差不多,15分钟内200多人在线吧。
持续一个月了,找不到什么好方法来解决,如果是程序问题该如何来弄呢

解决方案 »

  1.   

    还有就是看看数据库链接池是否已满,如果是满的,估计没有释放SQL链接
      

  2.   

    我用sp_who查看了下数据连接,少的时候有20多个,多的时候有100多个
    并且90%都是sleeping的连接
      

  3.   

    代码不够优化吧,数据处理也是很大的方面,可能存在未闭合的访问或者没必要的循环,另外清空一下IIS缓存看看
      

  4.   

    原因很明显把底层优化一下,非托管的对象手动.Dispose();其它的感觉有必要的,丢using(){}里
      

  5.   

    我看了下数据连接是直接
    conn.close()
    在这之前加个conn.dispose()?
      

  6.   

    我们一般都是用完就直接 close,不管成功与否都close
            /// <summary>
            /// 更新数据库记录(SQL句柄)
            /// </summary>
            /// <param name="strSql">要执行的SQL语句</param>
            /// <returns>执行成功返回True,否则返回False</returns>
            public override bool ExecuteUpdate(string strSql)
            {
                try
                {
                    Open();
                    SqlCommand cmd = new SqlCommand();
                    cmd.Connection = this.conn;
                    if (inTransaction)
                        cmd.Transaction = trans;
                    cmd.CommandText = strSql;
                    cmd.CommandType = CommandType.Text;
                    return cmd.ExecuteNonQuery() > 0;
                }
                catch
                {
                    return false;
                }
                finally
                {
                    this.conn.Close();
                }
            }        /// <summary>
            /// 更新数据库记录(存储过程)
            /// </summary>
            /// <param name="strSql">SQL句柄</param>
            /// <param name="strParams">存储过程变量集</param>
            /// <param name="strValues">存储过程内容集</param>
            /// <returns>执行成功返回True,否则返回False</returns>
            public override bool ExecuteUpdate(string strSql, string[] strParams, object[] strValues)
            {
                try
                {
                    Open();
                    SqlCommand cmd = new SqlCommand();
                    cmd.Connection = this.conn;
                    if (inTransaction)
                        cmd.Transaction = trans;
                    if ((strParams != null) && (strParams.Length != strValues.Length))
                        throw new Exception("查询参数和值不对应!");
                    cmd.CommandText = strSql;
                    cmd.CommandType = CommandType.Text;
                    if (strParams != null)
                    {
                        for (int i = 0; i < strParams.Length; i++)
                        {
                            SqlParameter param = new SqlParameter(strParams[i], strValues[i]);
                            cmd.Parameters.Add(param);                    }
                    }
                    return cmd.ExecuteNonQuery() > 0;
                }
                catch
                {
                    return false;
                }
                finally
                {
                    this.conn.Close();
                }
            }
            #endregion
            #region GetDataSet 重载        /// <summary>
            /// 获取数据源DataSet(存储过程)
            /// </summary>
            /// <param name="strSql">SQL句柄</param>
            /// <param name="strParams">变量集</param>
            /// <param name="strValues">内容集</param>
            /// <returns>返回一个DataSet数据源</returns>
            public override DataSet GetDataSet(string strSql, string[] strParams, object[] strValues)
            {
                try
                {
                    SqlCommand cmd = new SqlCommand();
                    cmd.Connection = this.conn;
                    if (inTransaction)
                        cmd.Transaction = trans;
                    if ((strParams != null) && (strParams.Length != strValues.Length))
                        throw new Exception("查询参数和值不对应!");
                    cmd.CommandText = strSql;
                    if (strParams != null)
                    {
                        for (int i = 0; i < strParams.Length; i++)
                        {
                            SqlParameter param = new SqlParameter(strParams[i], strValues[i]);
                            cmd.Parameters.Add(param);
                        }
                    }
                    DataSet ds = new DataSet();
                    SqlDataAdapter ad = new SqlDataAdapter();
                    ad.SelectCommand = cmd;
                    ad.Fill(ds);
                    return ds;
                }
                catch
                {
                    return null;
                }
                finally
                {
                    this.conn.Close();
                }        }
            /// <summary>
            /// 取数据源DataSet(SQL句柄)
            /// </summary>
            /// <param name="QueryString">SQL句柄</param>
            /// <returns>返回一个DataSet数据源</returns>
            public override DataSet GetDataSet(string QueryString)
            {
                try
                {
                    SqlCommand cmd = new SqlCommand();
                    cmd.Connection = this.conn;
                    if (inTransaction)
                        cmd.Transaction = trans;
                    DataSet ds = new DataSet();
                    SqlDataAdapter ad = new SqlDataAdapter();
                    cmd.CommandText = QueryString;
                    ad.SelectCommand = cmd;
                    ad.Fill(ds);
                    return ds;
                }
                catch
                {
                    return null;
                }
                finally
                {
                    this.Close();
                }
            }
            #endregion
      

  7.   

            public void OpenConnection()
            {
                connCount++;
                if (connCount == 1)
                {
                    _conn.Open();
                }
            }
            /// <summary>
            /// 将连接计数减1,如果连接计数为0则关闭连接
            /// </summary>
            public void CloseConnection()
            {
                connCount--;
                if (connCount <= 0)
                {
                    connCount = 0;
                    _conn.Close();
                    
                }
            }
    这个sqlhelper是在网上下的,作者是这样描述的
    1. 内部不使用具体的ADO.NET对象。使用如IDbConnection,IDbCommand等。所以较容易更换数据库。2. Execute系列方法对连接状态都是自适应,使用连接计数。类似Adapter.Fill方法,若在方法外面已经打开连接,则方法内部不会重新打开连接也不会关闭连接,若方法外面没有打开连接,则方法内部自己打开连接并在方法结束时关闭连接。(ExecuteReader方法不会自己打开数据连接)3. SqlHelper的Execute静态方法系列,可通过静态方法OpenConnection()和CloseConnection()连接多个数据访问操作,可以嵌套。事务也可以这样串联。由于数据打开和关闭、以及事务的管理,都使用计数器,使得在编写一个方法的时候可以先不管外界调用时是否要将其放在一个事务中串联。==================================================================================
    这样使用连接计数器,如果连接多了就不会关闭了
      

  8.   

    #region execute方法,执行操作的方法        /// <summary>
            /// 执行指定的 Transact-SQL 语句并返回受影响的行数。
            /// </summary>
            /// <param name="strCmd"></param>
            /// <returns></returns>
            public int ExecuteNonQuery(string strCmd, CommandType type, params IDbDataParameter[] parameters)
            {
                try
                {
                    OpenConnection();                IDbCommand cmd = CreateCommandAll(strCmd, type, parameters);
                    return cmd.ExecuteNonQuery();
                }
                finally
                {
                    CloseConnection();
                }
            }
            /// <summary>
            /// 执行查询,并返回查询所返回的结果集中第一行的第一列。忽略额外的列或行。
            /// </summary>
            /// <param name="strCmd"></param>
            /// <returns></returns>
            public object ExecuteScalar(string strCmd, CommandType type, params IDbDataParameter[] parameters)
            {
                try
                {
                    OpenConnection();                IDbCommand cmd = CreateCommandAll(strCmd, type, parameters);
                    return cmd.ExecuteScalar();
                }
                finally
                {
                    CloseConnection();
                }
            }
            /// <summary>
            /// 执行查询,生成一个DataReader返回数据(此函数内部不会调用OpenConnection和CloseConnection)
            /// </summary>
            /// <param name="strCmd"></param>
            /// <returns></returns>
            public IDataReader ExecuteReader(string strCmd, CommandType type, params IDbDataParameter[] parameters)
            {
                IDbCommand cmd = CreateCommandAll(strCmd, type, parameters);
                return cmd.ExecuteReader();
            }
            /// <summary>
            /// 执行查询,并返回一个DataSet对象
            /// </summary>
            /// <param name="strCmd"></param>
            /// <returns></returns>
            public DataSet ExecuteDataSet(string strCmd, CommandType type, params IDbDataParameter[] parameters)
            {
                try
                {
                    OpenConnection();                IDbCommand cmd = CreateCommandAll(strCmd, type, parameters);                IDbDataAdapter adapter = _dbProvider.CreateDataAdapter();
                    adapter.SelectCommand = cmd;                DataSet ds = new DataSet();
                    adapter.Fill(ds);                return ds;
                }
                finally
                {
                    CloseConnection();
                }
            }
            /// <summary>
            /// 执行查询,并返回一个DataTable对象
            /// </summary>
            /// <param name="strCmd"></param>
            /// <returns></returns>
            public DataTable ExecuteDataTable(string strCmd, CommandType type, params IDbDataParameter[] parameters)
            {
                try
                {
                    OpenConnection();                IDbCommand cmd = CreateCommandAll(strCmd, type, parameters);                IDbDataAdapter adapter = _dbProvider.CreateDataAdapter();
                    adapter.SelectCommand = cmd;                DataSet ds = new DataSet();
                    adapter.Fill(ds);                return ds.Tables[0];
                }
                finally
                {
                    CloseConnection();
                }
            }        #endregion
    把这些方法都贴出来,大家看看,需要怎么改进
      

  9.   

    借楼主的贴子,我问个我迷惑的问题
    9楼的朋友,我想知道,你那样的代码
    把return 这个关键字放到catch块里,你确定这以后程序还会执行finaly块吗??我现在迷惑我对return关键字的理解,一下以来我都认为它是所有表达式中优先级很高的,按我的理解,代码遇到了return字样后,会直接把内存地址指针回退到调用处的,就是上一级,而会忽略return后面的所有操作的难道是我理解错误啦???跪求解答
      

  10.   

    static void Main(string[] args)
            {
                Console.Write("i的值是:"+GetCount());
                Console.ReadKey();            
            }        private static int GetCount()
            {
                int i = 1;
                try
                {
                    return i;
                }
                catch (Exception ex)
                {
                }
                finally
                {
                    ++i;
                    Console.Write(" finally ");
                }
                return i;
            }这个问题我告诉你,你自己去测试测试,给你个小程序看看
    自己调试下,看下每一步是怎么执行的,在看下结果
      

  11.   

    ExecuteReader最有可能出在这个上边ExecuteReader要结合CommandBehavior.CloseConnection和using
    using (SqlDr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
      

  12.   

    我也觉得是,所以我现在有个想法就是用上datareader的地方都换成dataset
    这样做可取吗
      

  13.   

    并且我看了下项目里面用到ExecuteReader的地方。
    都是先SqlHelper.OpenConnection();
    用完后 SqlHelper.CloseConnection();
      

  14.   

    好多高手。新手围观下。
    论坛签名======================================================================liuxibei1987:你好!
    截至 2011-10-28 14:41:54 前:
    你已发帖 59 个, 未结贴 0 个;
    结贴率为: 100.00%

    当您的问题得到解答后请及时结贴.

    http://topic.csdn.net/u/20090501/15/7548d251-aec2-4975-a9bf-ca09a5551ba5.html
    http://topic.csdn.net/u/20100428/09/BC9E0908-F250-42A6-8765-B50A82FE186A.html
    http://topic.csdn.net/u/20100626/09/f35a4763-4b59-49c3-8061-d48fdbc29561.html如何给分和结贴?
    http://community.csdn.net/Help/HelpCenter.htm#结帖如何给自己的回帖中也加上签名?
    http://blog.csdn.net/q107770540/archive/2011/03/15/6250007.aspx
      

  15.   

    你4个那玩意还新手啊。看你写了那么长的代码。。新手无语中。我的3个是混分啊。。哈哈
    论坛签名======================================================================liuxibei1987:你好!
    截至 2011-10-28 14:41:54 前:
    你已发帖 59 个, 未结贴 0 个;
    结贴率为: 100.00%

    当您的问题得到解答后请及时结贴.

    http://topic.csdn.net/u/20090501/15/7548d251-aec2-4975-a9bf-ca09a5551ba5.html
    http://topic.csdn.net/u/20100428/09/BC9E0908-F250-42A6-8765-B50A82FE186A.html
    http://topic.csdn.net/u/20100626/09/f35a4763-4b59-49c3-8061-d48fdbc29561.html如何给分和结贴?
    http://community.csdn.net/Help/HelpCenter.htm#结帖如何给自己的回帖中也加上签名?
    http://blog.csdn.net/q107770540/archive/2011/03/15/6250007.aspx
      

  16.   

    我晕死。。那是以前在ASP专区。。都一年没有来CSDN了。
    现在转ASP.NET中。忽忽。
    论坛签名======================================================================liuxibei1987:你好!
    截至 2011-10-28 14:41:54 前:
    你已发帖 59 个, 未结贴 0 个;
    结贴率为: 100.00%

    当您的问题得到解答后请及时结贴.

    http://topic.csdn.net/u/20090501/15/7548d251-aec2-4975-a9bf-ca09a5551ba5.html
    http://topic.csdn.net/u/20100428/09/BC9E0908-F250-42A6-8765-B50A82FE186A.html
    http://topic.csdn.net/u/20100626/09/f35a4763-4b59-49c3-8061-d48fdbc29561.html如何给分和结贴?
    http://community.csdn.net/Help/HelpCenter.htm#结帖如何给自己的回帖中也加上签名?
    http://blog.csdn.net/q107770540/archive/2011/03/15/6250007.aspx
      

  17.   

    那你肯定也是高手了。
    asp专区的大神啊
      

  18.   

    还行吧。。现在都ASP.NET的时代了。ASP out了。
    所以得转asp.net论坛签名======================================================================liuxibei1987:你好!
    截至 2011-10-28 14:41:54 前:
    你已发帖 59 个, 未结贴 0 个;
    结贴率为: 100.00%

    当您的问题得到解答后请及时结贴.

    http://topic.csdn.net/u/20090501/15/7548d251-aec2-4975-a9bf-ca09a5551ba5.html
    http://topic.csdn.net/u/20100428/09/BC9E0908-F250-42A6-8765-B50A82FE186A.html
    http://topic.csdn.net/u/20100626/09/f35a4763-4b59-49c3-8061-d48fdbc29561.html如何给分和结贴?
    http://community.csdn.net/Help/HelpCenter.htm#结帖如何给自己的回帖中也加上签名?
    http://blog.csdn.net/q107770540/archive/2011/03/15/6250007.aspx
      

  19.   

    下班了,回家咯。
    asp.net做网站不给力啊,我想去学学php了
      

  20.   

    88.
    asp.net很好啊。不懂php。哈哈。
    论坛签名======================================================================liuxibei1987:你好!
    截至 2011-10-28 15:52:46 前:
    你已发帖 60 个, 未结贴 1 个;
    结贴率为: 98.33%

    当您的问题得到解答后请及时结贴.

    http://topic.csdn.net/u/20090501/15/7548d251-aec2-4975-a9bf-ca09a5551ba5.html
    http://topic.csdn.net/u/20100428/09/BC9E0908-F250-42A6-8765-B50A82FE186A.html
    http://topic.csdn.net/u/20100626/09/f35a4763-4b59-49c3-8061-d48fdbc29561.html如何给分和结贴?
    http://community.csdn.net/Help/HelpCenter.htm#结帖如何给自己的回帖中也加上签名?
    http://blog.csdn.net/q107770540/archive/2011/03/15/6250007.aspx
      

  21.   

    //不及明白你为什么这样的机制来控制连接对象的开关,难道是想用mssql2005版本以后的MARS(多活动结果集)特征????这特征我曾经也用过,但感觉不是很稳定,性能也不咋样MARS特征的好处是使用同一个链接对象,可以执行多个command