网站运行一段时间后出现以下错误,我想应该是没关闭数据库连接才会出现这个问题吧?
可我的数据层已经关闭了啊。
我的所有的数据库操作都放在SQLHelper.cs这个类了。在这里打开数据库马上就关闭了啊。其它业务逻辑层不需要再关闭了吧。
我的SQLHelper.cs这个类的代码: public static void ExecuteNonQuery(string connString, CommandType cmdType, string cmdText, params SqlParameter[] cmdParms) 
{ SqlCommand cmd = new SqlCommand();
SqlConnection conn = new SqlConnection(connString); 
PrepareCommand(cmd, conn, null, cmdType, cmdText, cmdParms);
try
{
cmd.ExecuteNonQuery();
}
catch(SqlException e)
{
SystemLogs.WriteLog(e.ToString());
throw e;
}
finally
{
conn.Close();
cmd.Parameters.Clear();
}
}
public static SqlDataReader ExecuteReader(string connString, CommandType cmdType, string cmdText, params SqlParameter[] cmdParms) 
{
SqlCommand cmd = new SqlCommand();
SqlConnection conn = new SqlConnection(connString); try 
{
PrepareCommand(cmd, conn, null, cmdType, cmdText, cmdParms);
SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
cmd.Parameters.Clear();
return rdr;
}
catch(Exception e)
{
conn.Close();
SystemLogs.WriteLog(e.ToString());
throw;
}
} SqlCommand cmd = new SqlCommand();
SqlConnection conn = new SqlConnection(connString); try
{
PrepareCommand(cmd, conn, null, cmdType, cmdText, cmdParms);
SqlDataAdapter dap= new SqlDataAdapter();
dap.SelectCommand = cmd;
DataSet dst = new DataSet(DataSetName); dap.Fill(dst); conn.Close();
return dst;
}
catch(Exception e)
{
conn.Close();
SystemLogs.WriteLog(e.ToString());
throw;
}
“/”应用程序中的服务器错误。
--------------------------------------------------------------------------------超时时间已到。在从池中获取连接之前超时时间已过。出现这种情况可能是因为所有池连接都已被使用并已达到最大池大小。 
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.InvalidOperationException: 超时时间已到。在从池中获取连接之前超时时间已过。出现这种情况可能是因为所有池连接都已被使用并已达到最大池大小。

解决方案 »

  1.   

    public static DataSet ExecuteDataset(string DataSetName, string connString, CommandType cmdType, string cmdText, params SqlParameter[] cmdParms)
    {
    SqlCommand cmd = new SqlCommand();
    SqlConnection conn = new SqlConnection(connString); try
    {
    PrepareCommand(cmd, conn, null, cmdType, cmdText, cmdParms);
    SqlDataAdapter dap= new SqlDataAdapter();
    dap.SelectCommand = cmd;
    DataSet dst = new DataSet(DataSetName); dap.Fill(dst); conn.Close();
    return dst;
    }
    catch(Exception e)
    {
    conn.Close();
    SystemLogs.WriteLog(e.ToString());
    throw;
    }
    }
      

  2.   

    可能是SqlDataReader 出问题,返回一个 SqlDataReader 本身不是一个好的办法!
    而且出错后没有关闭 SqlDataReader!
      

  3.   

    建议在你的程序中加入这段对连接池的处理代码试下
    /// <summary>
    /// 开始使用连接池中连接对象的方法.
    /// <p>* 使用此方法将从连接池中获取一个连接对象;</p>
    /// <p>* 如果当前连接池没有空闲连接, 则将强行释放一个占用时间最长并且大于超时时间间隔的连接以供当前使用.</p>
    /// 线程安全
    /// </summary>
    /// <param name="milliseconds">超时的时间间隔(以毫秒计算)</param>
    /// <returns>连接对象</returns>
    /// <res>
    /// <p>使用此方法将获取一个数据库连接对象, 并且可以为这个数据库连接对象设置一个使用时间的上限值. 如果当连接池中没有空闲的连接对象时, 此方法将强制释放一个使用时间超长的连接对象以供使用.</p>
    /// </res>
    public OleDbConnectObj StartToUseConnection(int milliseconds)
    {
    System.DateTime time = System.DateTime.Now;
    System.TimeSpan span = new TimeSpan(0, 0, 0, 0, milliseconds);
    int ptr = -1;
    Monitor.Enter(OleDbConnPool);
    for(int i = 0; i < OleDbConnPool.Length; i++)
    {
    if(!OleDbConnPool[i].IsInUse)//如果当前连接空闲, 则打开并使用.
    {
    OleDbConnPool[i].IsInUse = true;
    OleDbConnPool[i].StartTime = time;
    Monitor.Exit(OleDbConnPool);//在进行数据库操作之前释放对象锁定, 避免死锁发生.
    try
    {
    if(OleDbConnPool[i].OleDbCon.State == ConnectionState.Closed)
    {
    OleDbConnPool[i].OleDbCon.Open();
    }
    }
    catch(OleDbException ex)
    {
    throw new Exception(Exceptions.ConnectionError, ex);
    }
    return OleDbConnPool[i];
    }
    else//如果当前连接没有空闲, 则比较其被占用时间. 如果占用时间大于当前最大时间间隔, 则更新最大时间间隔并将指针指向当前连接
    {
    if(span <= (time - OleDbConnPool[i].StartTime))
    {
    span = time - OleDbConnPool[i].StartTime;
    ptr = i;
    }
    }
    }
    //如果没有找到空闲的连接对象, 则将占用最久的连接对象强行释放掉.
    //然后在打开使用.
    if(ptr != -1)
    {
    OleDbConnPool[ptr].OleDbCon.Close();
    OleDbConnPool[ptr].StartTime = System.DateTime.Now;
    OleDbConnPool[ptr].OleDbCon.Open();
    Monitor.Exit(OleDbConnPool);
    return OleDbConnPool[ptr];
    }
    Monitor.Exit(OleDbConnPool);
    return null;
    }
      

  4.   

    你是否使用的是ExecuteNonQuery(string connString, CommandType cmdType, string cmdText, params SqlParameter[] cmdParms)方法还是
    ExecuteNonQuery(SqlConnection conn, CommandType cmdType, string cmdText, params SqlParameter[] cmdParms)??SqlDataReader不是立即断开的,读取绑定时一直保持连接的
      

  5.   

    public DataSet RunProcDS(string procName) {
    SqlCommand cmd = CreateCommand(procName, null);
    SqlDataAdapter ada =new SqlDataAdapter(cmd);
    DataSet ds=new DataSet();
    ada.Fill(ds,"t1");
    return ds;
    }

    /// <summary>
    /// Run stored procedure,have params,return DataSet.
    /// </summary>
    /// <param name="procName">Name of stored procedure.</param>
    /// <param name="prams">Stored procedure params.</param>
    /// <param name="dataSet">Return result of procedure.</param>
    public DataSet RunProcDS(string procName, SqlParameter[] prams) {
    SqlCommand cmd = CreateCommand(procName, prams);
    SqlDataAdapter ada =new SqlDataAdapter(cmd);
    DataSet ds=new DataSet();
    ada.Fill(ds,"t1");
    return ds;
    }
    /// <summary>
    /// Run Sql State,return DataReader.
    /// </summary>
    public SqlDataReader RunSqlDR(string Sql) 
    {
    SqlCommand cmd = CreateCommand2(Sql, null);
    return cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
    } public DataSet RunSqlDS(string Sql)
    {
    SqlCommand cmd=CreateCommand2(Sql,null);
    SqlDataAdapter sda=new SqlDataAdapter(cmd);
    DataSet ds=new DataSet();
    sda.Fill(ds);
    return ds;
    }
    /// <summary>
    /// Run sql string,return value.
    /// </summary>
    public object RunSqlValue(string sql)
    {
    SqlCommand cmd = CreateCommand2(sql,null);
    object val=cmd.ExecuteScalar();
    this.Close();
    return val;
    }private SqlCommand CreateCommand(string procName, SqlParameter[] prams) {
    // make sure connection is open
    Open(); //command = new SqlCommand( sprocName, new SqlConnection( ConfigManager.DALConnectionString ) );
    SqlCommand cmd = new SqlCommand(procName, con);
    cmd.CommandType = CommandType.StoredProcedure; // add proc parameters
    if (prams != null) {
    foreach (SqlParameter parameter in prams)
    cmd.Parameters.Add(parameter);
    }

      // return param
    cmd.Parameters.Add(
    new SqlParameter("ReturnValue", SqlDbType.Int, 4,
    ParameterDirection.ReturnValue, false, 0, 0,
    string.Empty, DataRowVersion.Default, null)); return cmd;
    }
    /// <summary>
    /// Create command object by Text.
    /// </summary>
    private SqlCommand CreateCommand2(string stringcmd, SqlParameter[] prams) {
    // make sure connection is open
    Open();

    SqlCommand cmd = new SqlCommand(stringcmd, con);
    cmd.CommandType = CommandType.Text; // add proc parameters
    if (prams != null) {
    foreach (SqlParameter parameter in prams)
    cmd.Parameters.Add(parameter);
    }

    return cmd;
    }
      

  6.   

    private SqlCommand CreateCommand(string procName, SqlParameter[] prams) {
    // make sure connection is open
    Open(); //command = new SqlCommand( sprocName, new SqlConnection( ConfigManager.DALConnectionString ) );
    SqlCommand cmd = new SqlCommand(procName, con);
    cmd.CommandType = CommandType.StoredProcedure; // add proc parameters
    if (prams != null) {
    foreach (SqlParameter parameter in prams)
    cmd.Parameters.Add(parameter);
    }

      // return param
    cmd.Parameters.Add(
    new SqlParameter("ReturnValue", SqlDbType.Int, 4,
    ParameterDirection.ReturnValue, false, 0, 0,
    string.Empty, DataRowVersion.Default, null)); return cmd;
    }
    /// <summary>
    /// Create command object by Text.
    /// </summary>
    private SqlCommand CreateCommand2(string stringcmd, SqlParameter[] prams) {
    // make sure connection is open
    Open();

    SqlCommand cmd = new SqlCommand(stringcmd, con);
    cmd.CommandType = CommandType.Text; // add proc parameters
    if (prams != null) {
    foreach (SqlParameter parameter in prams)
    cmd.Parameters.Add(parameter);
    }

    return cmd;
    }public void Close() {
    if (con != null)
    con.Close();
    } /// <summary>
    /// Release resources.
    /// </summary>
    public void Dispose() {
    // make sure connection is closed
    if (con != null) {
    con.Dispose();
    con = null;
    }
    }
      

  7.   

    微软的 sqlhelper 的 Application block ?
      

  8.   

    To  xiaodao2008(小刀) 
    绝对不会,这个类中有参数缓存,频繁的操作刚好提高了性能建议查阅:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnbda/html/daab-rm.asp
      

  9.   

    我的就是取自DAAB,感觉没任何问题。
      

  10.   

    在调用SqlDataReader的时候,最好采用例子中的方法:
    using (System.Data.SqlClient.SqlDataReader dr= SqlHelper.ExecuteReader(connectionString,CommandType,CommandText) ){
          while(dr.Read()){
              //code here
          }}
    or 
    System.Data.SqlClient.SqlDataReader dr
    try{
         dr= SqlHelper.ExecuteReader(connectionString,CommandType,CommandText) ;
         while(dr.Read(){
             //code here
         }
    }
    finally{
        dr.Close();
    }确保dr都能被释放
      

  11.   

    我调用datareader:
    public  NewsContentInfo GetContentByNewsID(string strRecordID)
    {
    if (strRecordID == string.Empty)
    return null; Hashtable htbl = new Hashtable();
    htbl.Add("RecordID",strRecordID); NewsContentDB accountDB = new  NewsContentDB();
    SqlDataReader dtrAccount = accountDB.Read(htbl); NewsContentInfo accountInfo = null; if (dtrAccount.Read())
    {
    accountInfo = new  NewsContentInfo(strRecordID,  dtrAccount.GetString(2), dtrAccount.GetString(3), 
    dtrAccount.GetString(4),dtrAccount.GetString(5),dtrAccount.GetInt32(6),dtrAccount.GetInt32(7),dtrAccount.GetInt32(8),dtrAccount.GetString(9), dtrAccount.GetString(10), dtrAccount.GetString(11),
    dtrAccount.GetDateTime(12), dtrAccount.GetString(13), dtrAccount.GetString(14));
    }
    dtrAccount.Close();
    return accountInfo;
    }
      

  12.   

    dtrAccount.Close();
    这里错误只关闭了dr,并未关闭连接
      

  13.   

    参考PetShop的架构设计吧,还自己写什么,直接COPY过来不就行了。
    看看你写的代码,真的是很难看,如果你要返回一个阅读器的对象,一定要在用完datareader后,将其关闭。否则会占用connection的
      

  14.   

    dtrAccount.Close();
    这里错误只关闭了dr,并未关闭连接
    你的helper是改造过的,原来的helper中的dr:Command1.ExecuteReader(CommandBehavior.CloseConnection);
      

  15.   

    请显式关闭数据库连接
    NewsContentDB accountDB = new  NewsContentDB();而且原来的SqlHelper中的方法是静态方法,无需实例化的
      

  16.   

    try 
    {
    PrepareCommand(cmd, conn, null, cmdType, cmdText, cmdParms);
    SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
    cmd.Parameters.Clear();
    return rdr;
    }
    catch(Exception e)
    {
    conn.Close();
    SystemLogs.WriteLog(e.ToString());
    throw;
    }
    catch里的代码是出错以后才执行的,你conn.close在里面,每次执行正常联接都不会断开,所以越来越多的联接,你就挂了,出这个问题的主要原因就是conn.open了没有close,楼主还是再查一下代码看看哪里没有close,呵
      

  17.   

    SQLHelper.cs这个东西还有些人批评?我想微软的东西还是比较好的吧,出错是没用好吧,应该是没有关闭连接。看看SqlHelper的帮助。
      

  18.   

    我很不服气。我的东西都是从petshop里抽取的。
    大家说我什么什么不对。有没有仔细看看代码?SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);这句语法是什么?大家都没看清楚,就说我没关闭数据库连接。我返回datareader,只要关闭了这个datareader,数据库连接就会关闭的。
      

  19.   

    dtrAccount.Close();
    throw new Exception(conn.State);
    return accountInfo;
    戒骄戒躁