具体的原因,我们来看代码(用reflector反编译.net framework 2.0的dll)
dbconn有一个方法叫做:Open,部分代码如下:
1
try
2
注意上面的第4行,this.InnerConnection.OpenConnection(this, this.ConnectionFactory);这里的this.ConnectionFactory是一个DbConnectionFactory类型,定义在class SqlConnection中2
1
try
2
}
看一下第4行,哈,这里绕到了我们上面的conn factory,我们看它里面的GetConnection怎么写的?(class DbConnectionFactory)2
1
internal DbConnectionInternal GetConnection(DbConnection owningConnection)
2
}
注意第5行里面的GetConnectionPool的调用,继续看它内部的代码:(class DbConnectionFactory)2
1
private DbConnectionPool GetConnectionPool(DbConnection owningObject, DbConnectionPoolGroup connectionPoolGroup)
2
}
注意第9行,我们go on...(Class DbConnectionFactory)2
1
if ((poolOptions == null) && ADP.IsWindowsNT)
2
依然是第9行(枯燥的数字。。。),继续往里面看:(Class DbConnectionFactory)2
1
internal SqlConnectionString(string connectionString) : base(connectionString, GetParseSynonyms(), false)
2
);
===============================其他代码省略========================================
}
这段代码很长,但是我们注意上面的第17行,这里有一个默认值100,就是说,如果你没有在connection string中指定max pool size,那么该值就是100。2
===============================其他代码省略========================================
}
那么,如果我们代码中对于dbconn进行了Open,没有进行Close,conn pool就会一直增长,一直涨到100,涨到这个Max Pool Size。原因我们看下面:(Class DbConnectionPool)
1
case 2:
2
Bid.PoolerTrace("<prov.DbConnectionPool.GetConnection|RES|CPOOL> %d#, Creating new connection.\n", this.ObjectID);
3
try
4
注意上面的第5行,UserCreateRequest,看这个方法:2
3
4
上面写了这么多,结论就是,如果dbconn在Open之后,没有Close,那么会造成conn个数上涨,到100之后就会停下来。第101个链接的请求,是无法创建成功的。这样,db和web server很可能都是CPU很低,如0%,但是客户端的响应时间就是很长,造成性能下降。