我有以下方法:
public DataSet GetDataSet( string sp, params SqlParameter[] parameters ) {
DataSet ds = new DataSet();
using ( SqlConnection conn = new SqlConnection(
ConfigurationManager.ConnectionStrings["myConnectionString"].ConnectionString
) ) {
using ( SqlCommand cmd = new SqlCommand() ) {
cmd.Connection = conn;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = sp;
if ( parameters != null ) {
foreach ( SqlParameter parm in parameters ) {
cmd.Parameters.Add( parm );
}
}
if ( conn.State == ConnectionState.Closed ) {
conn.Open();
}
using ( SqlDataAdapter da = new SqlDataAdapter( cmd ) ) {
da.Fill( ds );
}
}
}
return ds; }
我注意到多次调用此方法时会创建多个连接(大约50次)。 我通过在SQL中执行此查询来检查这一点:
SELECT DB_NAME(dbid) as 'DbNAme', COUNT(dbid) as 'Connections' from master.dbo.sysprocesses with (nolock) WHERE dbid > 0 GROUP BY dbid
调用上述方法时,连接数会不断增加。它不应该一遍又一遍地使用相同的连接(连接池)而不是创建新的连接吗?
答案 0 :(得分:4)
尝试在web.config中的连接字符串中增加最大池大小,如此
<add name="ConString" connectionString="SERVER=localhost;DATABASE=databasename;UID=username;PWD=password;Pooling=true;Max Pool Size=100;"/>
或者你定义它的任何地方。它解决了问题,但暂时解决了你的代码永久解决方案你可能没有关闭连接
希望它会帮助你
答案 1 :(得分:4)
这个link很好地解释了连接池。如果你想了解整个事情,你应该阅读这篇文章非常好。
连接池减少了数量 新连接必须是的时代 打开。合伙人保持所有权 物理连接。它管理 通过保持一组的连接来建立联系 每个给定的活动连接 连接配置。每当一个 用户调用在连接上打开, pooler寻找可用的 池中的连接。如果汇集了 连接可用,它返回它 调用者而不是打开新的 连接。当应用程序调用时 关闭连接,pooler 将其返回到合并的活动集 连接而不是关闭它。 一旦连接返回到 游泳池,它准备重新使用 下一次公开电话。
答案 2 :(得分:3)
连接池并不意味着它将重用连接。由于建立SQL连接的成本很高,因此连接池保持固定的最大连接数,并且当您在连接上调用.Close()
时,它只会返回到池,然后池可以将其传递给新连接在新实例上调用Open()
时。
这个机制内置在SqlConnection类中,这就是它对用户透明的原因;简而言之:只要正确using
连接(就像你一样),你就不必担心打开连接的数量。
答案 3 :(得分:0)
填写数据集后尝试关闭连接。使用语句释放对象,但它不会关闭连接。