以前一直以为只有连接打开的时候才新建立一个连接池.其实不是.应该是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();不知道我说的对不对.欢迎指教

解决方案 »

  1.   

    Pooling = 'true' 
     
      

  2.   

    一般连接池是在启动服务器的时候就会建好的,还会创建默认的连接数。 你getConnection() 只是从逻辑上获取一个连接, 也就是说从连接池获取一个。  然后你close()的时候,其实也是逻辑上关闭,真正意义上并没有关闭,而是放回连接池里面了。