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

急晕了的有关问题:asp在访问数据库时出现连接超时异常,提示可能达到数据库连接的最大数

2011-12-29 
急晕了的问题:::asp在访问数据库时出现连接超时错误,提示可能达到数据库连接的最大数因为,页面上数据较多,

急晕了的问题:::asp在访问数据库时出现连接超时错误,提示可能达到数据库连接的最大数
因为,页面上数据较多,全部提交保存的时候,对每一条数据都有个去数据库CHECK的步骤,就会出现如下错误:
タイムアウトに達しました。プールから接続を取得する前にタイムアウト期間が過ぎました。プールされた接続がすべて使用中で、プール   サイズの制限値に達した可能性があります。  
説明   :   現在の   Web   要求を実行中に、ハンドルされていない例外が発生しました。エラーに関する詳細および例外の発生場所については、スタック   トレースを参照してください。  

例外の詳細:   System.InvalidOperationException:   タイムアウトに達しました。プールから接続を取得する前にタイムアウト期間が過ぎました。プールされた接続がすべて使用中で、プール   サイズの制限値に達した可能性があります。

ソース   エラー:  


行   1649:if(conn   !=   null   &&   conn.State.Equals(ConnectionState.Closed))
行   1650:{
行   1651:conn.Open();
行   1652:}
行   1653:
 


以下是我写的程序
public   int   getDateDiff(DateTime   startDate,DateTime   endDate)
{

SqlDataReader   reader   =   null;
int   DiffMonth   =   0;
try
{
string   sql   =   "select   datediff(month,@startDate,@endDate)   from   sysusers ";
SqlCommand   sqlcmd   =   new   SqlCommand(sql,conn);
sqlcmd.Parameters.Add( "@startDate ",   SqlDbType.VarChar).Value   =   startDate;
sqlcmd.Parameters.Add( "@endDate ",   SqlDbType.VarChar).Value   =   endDate;
if(conn   !=   null   &&   conn.State.Equals(ConnectionState.Closed))
{
conn.Open();
}

reader   =   sqlcmd.ExecuteReader();
if(reader.Read())
{
DiffMonth   =   reader.GetInt32(0);
}
return   DiffMonth;

}
catch(SqlException   ex)
{
Console.WriteLine(ex.Message);
return   0;
}
finally
{
if(reader!=   null   &&   !reader.IsClosed   )
{
reader.Close();
}
conn.Close();
}
}

[解决办法]
肯定是之前的连接没有关闭
[解决办法]
把return 0去掉.
[解决办法]
同意楼上的,去掉return 0,因为这个return了,导致下面的代码无法执行,导致前面运行的conn都没有关闭掉

去掉return 0,重新启动系统再看看。
[解决办法]
return 都返回了,不会执行后面,con没有关闭
[解决办法]
return 不影响finally 吧
_____________________________
刚才没看到try里面有个return,应该是问题的所在了;

RETURN

Exits unconditionally from a query or procedure.
RETURN is immediate and complete and can be used at any point to exit from a procedure, batch, or statement block. Statements following RETURN are not executed.

[解决办法]
你没有贴出你创建数据库连接的代码。假设它定义为:

private SqlConnection 根据数据库链接字符串创建新的连接());

不考虑业务逻辑问题,那么你的程序应该写为:

public int getDateDiff(DateTime startDate,DateTime endDate)
{
try
{
using(SqlConnection conn=根据数据库链接字符串创建新的连接())
{
conn.Open();
int DiffMonth = 0;
string sql = "select datediff(month,@startDate,@endDate) from sysusers ";
SqlCommand sqlcmd = new SqlCommand(sql,conn);
sqlcmd.Parameters.Add( "@startDate ", SqlDbType.VarChar).Value = startDate;
sqlcmd.Parameters.Add( "@endDate ", SqlDbType.VarChar).Value = endDate;


using(SqlDataReader reader = sqlcmd.ExecuteReader())
{
if(reader.Read())
return reader.GetInt32(0);
else
return 0;
}
}
}
catch(SqlException ex)
{
Console.WriteLine(ex.Message);
return 0;
}
}

“根据数据库链接字符串创建新的连接”会很慢么?这是不知道SQL Server引擎有连接池的。只要数据库连接串的值不改变,连接对象就可以准确和可靠地复用。你因为不知道怎样设计共享连接,所以才出错的。我们看到很多人说共享连接效率如何如何,可是sql server引擎已经具有连接池功能了他不知道,反而去自己胡写一个conn共享,这是多余的。
[解决办法]
从逻辑上,计算两个时间的差距要调用数据库去计算,你实在是太奢侈了。不过我这里不过多评论你这种过家家编程的习惯。

我要说明的是,你对conn的设计是过于聪明,结果制造了烦恼的。sql server的连接对象具有连接池功能,所以你应该在每一个线程内操作数据时都创建一个新的连接对象,并且不需要时尽早关闭。
[解决办法]
另外,使用using{}语法结构来处理数据库连接和DBDataReader,程序员不用去纠缠于哪一个代码是否关闭了它们的问题,程序员没有必要写conn.close或者reader.close代码,因此不需要承担更大责任。应该推荐或者强制使用这种语法结构去写代码。
[解决办法]
sp1234(嘿嘿) ( ) 信誉:98 Blog 加为好友 2007-4-28 13:17:08 得分: 0



另外,使用using{}语法结构来处理数据库连接和DBDataReader,程序员不用去纠缠于哪一个代码是否关闭了它们的问题,程序员没有必要写conn.close或者reader.close代码,因此不需要承担更大责任。应该推荐或者强制使用这种语法结构去写代码。



这个举双手赞成!
[解决办法]
另外,使用using{}语法结构来处理数据库连接和DBDataReader,程序员不用去纠缠于哪一个代码是否关闭了它们的问题,程序员没有必要写conn.close或者reader.close代码,因此不需要承担更大责任。应该推荐或者强制使用这种语法结构去写代码。
==========================================================================

同意

热点排行