以前一直以为只有连接打开的时候才新建立一个连接池.其实不是.应该是SqlConnection cn=new SqlConnection (连接字符串);就打开了一个连接所以在自己写DAL时候.在每个方法里都写一个methodA{
...
SqlConnection cn=new SqlConnection (连接字符串);
...
}这样就会打开许多连接,有时候即使所谓的"一劳永逸"的max pool=512都不管用(如果连接没关闭的话).
所以可以在DAL开始就声明一个连接static SqlConnection cn = null;
//在构造方法中实例一个连接
public 构造方法(){
cn=new SqlConnection (连接字符串);
}//其他方法中调用只需要引用这个cn.关闭可以close(),但不要dispose()
if (cn.State == ConnectionState.Closed)
cn.Open();
经"select count(*) from master..sysprocesses where dbid=db_id('数据库名字')"测试可以知道上面的连接一直保持在2(查询分析器占用一个连接)
第二个就是关于datareader的关闭问题.因为在读取的时候不能关闭cn.所以cn一直是打开的.所以如果在写datareader的时候是用的SqlConnection cn=new SqlConnection (连接字符串);那每实例一个datareader就打开了一个连接(且没关闭).这样会造成"应用程序'/',连接池已经超过最大数...".
一般写在这样public override IDataReader ReturnDataReader(string strSQL){
...
dr = cm.ExecuteReader(CommandBehavior.CloseConnection);
...
return dr;
}如果在其它地方引用需要关闭reader.这样reader所占用的连接就会关闭SqlDataReader sqlReader=(SqlDataReader)ReturnDataReader(SQL语句);
...
sqlReader.close();不知道我说的对不对.欢迎指教
...
SqlConnection cn=new SqlConnection (连接字符串);
...
}这样就会打开许多连接,有时候即使所谓的"一劳永逸"的max pool=512都不管用(如果连接没关闭的话).
所以可以在DAL开始就声明一个连接static SqlConnection cn = null;
//在构造方法中实例一个连接
public 构造方法(){
cn=new SqlConnection (连接字符串);
}//其他方法中调用只需要引用这个cn.关闭可以close(),但不要dispose()
if (cn.State == ConnectionState.Closed)
cn.Open();
经"select count(*) from master..sysprocesses where dbid=db_id('数据库名字')"测试可以知道上面的连接一直保持在2(查询分析器占用一个连接)
第二个就是关于datareader的关闭问题.因为在读取的时候不能关闭cn.所以cn一直是打开的.所以如果在写datareader的时候是用的SqlConnection cn=new SqlConnection (连接字符串);那每实例一个datareader就打开了一个连接(且没关闭).这样会造成"应用程序'/',连接池已经超过最大数...".
一般写在这样public override IDataReader ReturnDataReader(string strSQL){
...
dr = cm.ExecuteReader(CommandBehavior.CloseConnection);
...
return dr;
}如果在其它地方引用需要关闭reader.这样reader所占用的连接就会关闭SqlDataReader sqlReader=(SqlDataReader)ReturnDataReader(SQL语句);
...
sqlReader.close();不知道我说的对不对.欢迎指教
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货