网站运行一段时间后出现以下错误,我想应该是没关闭数据库连接才会出现这个问题吧?
可我的数据层已经关闭了啊。
我的所有的数据库操作都放在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: 超时时间已到。在从池中获取连接之前超时时间已过。出现这种情况可能是因为所有池连接都已被使用并已达到最大池大小。
可我的数据层已经关闭了啊。
我的所有的数据库操作都放在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: 超时时间已到。在从池中获取连接之前超时时间已过。出现这种情况可能是因为所有池连接都已被使用并已达到最大池大小。
解决方案 »
- 【求助】未能加载文件或程序集“System.WEB.DataVisualization, Version=3.5.0.0, Culture=neutral。。。
- 在win2003上搭建网站出现问题,大家帮忙看看啊
- 郁闷问题~数据连接超时
- 谁能帮忙解释下关于。net的一些问题
- 第一次写简历,拿出来让大家点评一下不足之处。
- 怎么样判断一个商品当天的点击数
- 刚面试回来...马上把题贴出来,大家看看....
- 可能是赋值的问题,我也不清楚,头大了
- 如何把文本矿中的一段文字转化成wav格式的文件并保存到固定的硬盘目录上面?
- 关于文件生成.DLL文件的问题,请各位老大帮下了,谢谢!
- datagrid中的一列值我是通过模式窗体关闭他时改变值的 回传时这一列值取出来的值还是原来的值 不是我改变后的值 我视图没有禁止 我在别
- 请问这样的数据,应该如何格式化呢?
{
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;
}
}
而且出错后没有关闭 SqlDataReader!
/// <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;
}
ExecuteNonQuery(SqlConnection conn, CommandType cmdType, string cmdText, params SqlParameter[] cmdParms)??SqlDataReader不是立即断开的,读取绑定时一直保持连接的
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;
}
// 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;
}
}
绝对不会,这个类中有参数缓存,频繁的操作刚好提高了性能建议查阅:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnbda/html/daab-rm.asp
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都能被释放
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;
}
这里错误只关闭了dr,并未关闭连接
看看你写的代码,真的是很难看,如果你要返回一个阅读器的对象,一定要在用完datareader后,将其关闭。否则会占用connection的
这里错误只关闭了dr,并未关闭连接
你的helper是改造过的,原来的helper中的dr:Command1.ExecuteReader(CommandBehavior.CloseConnection);
NewsContentDB accountDB = new NewsContentDB();而且原来的SqlHelper中的方法是静态方法,无需实例化的
{
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,呵
大家说我什么什么不对。有没有仔细看看代码?SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);这句语法是什么?大家都没看清楚,就说我没关闭数据库连接。我返回datareader,只要关闭了这个datareader,数据库连接就会关闭的。
throw new Exception(conn.State);
return accountInfo;
戒骄戒躁