首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

急访客增多,系统经常报错为:连接超时,怎么解决

2012-02-07 
急,访客增多,系统经常报错为:连接超时,如何解决?报错如下:Timeoutexpired.Thetimeoutperiodelapsedpriorto

急,访客增多,系统经常报错为:连接超时,如何解决?
报错如下:

Timeout   expired.     The   timeout   period   elapsed   prior   to   obtaining   a   connection   from   the   pool.     This   may   have   occurred   because   all   pooled   connections   were   in   use   and   max   pool   size   was   reached


在网上搜了一下,解释为连接过多,sqlconnection   打开后未关闭造成的!

下面是我的SQL访问代码,大家帮我看看有无关闭连接的问题?

如无问题,访客增多,如何增加连接池数量?谢谢!

public   sealed   class   sql
{


        private   sql()   {   }

        //Database   connection   strings
        public   static   readonly   string   CONN_STRING   =   ConfigurationManager.ConnectionStrings[ "space_wenxueConnectionString "].ConnectionString;

        ///   <summary>
        ///   Execute   a   SqlCommand   that   returns   a   resultset   against   the   database   specified   in   the   connection   string  
        ///   using   the   provided   parameters.
        ///   </summary>
        ///   <remarks>
        ///   e.g.:    
        ///     SqlDataReader   r   =   ExecuteReader(connString,   CommandType.StoredProcedure,   "PublishOrders ",   new   SqlParameter( "@prodid ",   24));
        ///   </remarks>
        ///   <param   name= "cmdType "> the   CommandType   (stored   procedure,   text,   etc.) </param>
        ///   <param   name= "cmdText "> the   stored   procedure   name   or   T-SQL   command </param>
        ///   <param   name= "cmdParms "> an   array   of   SqlParamters   used   to   execute   the   command </param>
        ///   <returns> A   SqlDataReader   containing   the   results </returns>
        public   static   SqlDataReader   ExecuteReader(CommandType   cmdType,   string   cmdText,   params   SqlParameter[]   cmdParms)
        {
                SqlCommand   cmd   =   new   SqlCommand();
                SqlConnection   conn   =   new   SqlConnection(CONN_STRING);

                //   we   use   a   try/catch   here   because   if   the   method   throws   an   exception   we   want   to  
                //   close   the   connection   throw   code,   because   no   datareader   will   exist,   hence   the  
                //   commandBehaviour.CloseConnection   will   not   work
                try


                {
                        //   cmd.CommandTimeout   =   150;
                        PrepareCommand(cmd,   conn,   null,   cmdType,   cmdText,   cmdParms);
                        SqlDataReader   rdr   =   cmd.ExecuteReader(CommandBehavior.CloseConnection);
                        cmd.Parameters.Clear();
                        return   rdr;
                }
                catch
                {
                        conn.Close();
                        throw;
                }
        }

        public   static   object   ExecuteScalar(CommandType   cmdType,   string   cmdText,   params   SqlParameter[]   cmdParms)
        {
                SqlCommand   cmd   =   new   SqlCommand();
                SqlConnection   conn   =   new   SqlConnection(CONN_STRING);

                PrepareCommand(cmd,   conn,   null,   cmdType,   cmdText,   cmdParms);
                object   val   =   cmd.ExecuteScalar();
                cmd.Parameters.Clear();
                return   val;

                conn.Close();

        }


        public   static   SqlDataReader   ExecuteReader(SqlConnection   conn,   CommandType   cmdType,   string   cmdText,   params   SqlParameter[]   cmdParms)
        {
                SqlCommand   cmd   =   new   SqlCommand();

                try
                {
                        PrepareCommand(cmd,   conn,   null,   cmdType,   cmdText,   cmdParms);
                        SqlDataReader   rdr   =   cmd.ExecuteReader(CommandBehavior.CloseConnection);
                        cmd.Parameters.Clear();
                        return   rdr;
                }
                catch
                {
                        conn.Close();


                        throw;
                }

        }


        public   static   object   ExecuteScalar(SqlConnection   conn,   CommandType   cmdType,   string   cmdText,   params   SqlParameter[]   cmdParms)
        {

                SqlCommand   cmd   =   new   SqlCommand();

                PrepareCommand(cmd,   conn,   null,   cmdType,   cmdText,   cmdParms);
                object   val   =   cmd.ExecuteScalar();
                cmd.Parameters.Clear();
                return   val;

                conn.Close();

        }
        ///   <summary>
        ///   Prepare   a   command   for   execution
        ///   </summary>
        ///   <param   name= "cmd "> SqlCommand   object </param>
        ///   <param   name= "conn "> SqlConnection   object </param>
        ///   <param   name= "trans "> SqlTransaction   object </param>
        ///   <param   name= "cmdType "> Cmd   type   e.g.   stored   procedure   or   text </param>
        ///   <param   name= "cmdText "> Command   text,   e.g.   Select   *   from   Products </param>
        ///   <param   name= "cmdParms "> SqlParameters   to   use   in   the   command </param>
        private   static   void   PrepareCommand(SqlCommand   cmd,   SqlConnection   conn,   SqlTransaction   trans,   CommandType   cmdType,   string   cmdText,   SqlParameter[]   cmdParms)
        {

                if   (conn.State   !=   ConnectionState.Open)
                        conn.Open();

                cmd.Connection   =   conn;
                cmd.CommandText   =   cmdText;

                if   (trans   !=   null)
                        cmd.Transaction   =   trans;

                cmd.CommandType   =   cmdType;

                if   (cmdParms   !=   null)
                {
                        foreach   (SqlParameter   parm   in   cmdParms)


                                cmd.Parameters.Add(parm);
                }
        }
}

[解决办法]
你把SqlDataReader 取值放在arraylist
关闭掉连接 试试

[解决办法]
SqlCommand cmd = new SqlCommand();
SqlConnection conn = new SqlConnection(CONN_STRING);

// we use a try/catch here because if the method throws an exception we want to
// close the connection throw code, because no datareader will exist, hence the
// commandBehaviour.CloseConnection will not work
try
{
// cmd.CommandTimeout = 150;
PrepareCommand(cmd, conn, null, cmdType, cmdText, cmdParms);
SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
cmd.Parameters.Clear();
return rdr;
}
catch
{
conn.Close();
throw;
}
------------------
这里打开没关
[解决办法]
DataReader这样的数据集是要占用数据库连接的,建采用DataSet或DataTable这样的离线型数据集
[解决办法]
在CATCH后边加上finally,在finally块里关闭连接
这样不管是否有异常都会关闭了
[解决办法]
try
{
// cmd.CommandTimeout = 150;
PrepareCommand(cmd, conn, null, cmdType, cmdText, cmdParms);
SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
cmd.Parameters.Clear();
conn.Close();//這裡也要關啊
return rdr;
}
catch
{
conn.Close();
throw;
}

[解决办法]
close()
[解决办法]
记得连接和DataReader用完都要关闭
如果访问量很大还是超时,可以考虑设置超时时间
[解决办法]
在CATCH后边加上finally,在finally块里关闭连接
这样不管是否有异常都会关闭了


//切记不要这么做
//欣赏这句的都是没做过大项目的

数据库的connection在用完后立即显式关闭
[解决办法]
DataReader这样的数据集是要占用数据库连接的,建采用DataSet或DataTable这样的离线型数据集
------------------------------------------------
顶一个,我也碰到过这样的,结果进程一会就吃光了
[解决办法]
给示例:
public static SqlDataReader ExecuteReader(string connectionString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) {
SqlCommand cmd = new SqlCommand();

SqlConnection conn = new SqlConnection(connectionString);
try
{
PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);
SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
cmd.Parameters.Clear();
return rdr;
}
catch
{
conn.Close();
throw;
}
}

注意加上 CommandBehavior.CloseConnection 这句.


[解决办法]
我以前也碰到这种情况,感觉SqlDataReader在用户量大时就会出现这个问题,

解决方案是:把SqlDataReader换成DataTable或DataSet就行了.

[解决办法]
建议把数据库操作写成一个类。要改也方面些。
[解决办法]
DataReader是速度最快的选择 你的访问量大建议还是用DataReader
DataReader不是一次取完所有数据 所以不能立即关闭连接 需要在你处理完所有数据后关闭。
实际上关闭DataReader也可以关闭连接。

热点排行