[英]Closing SQL-connection but open connections keeps incrementing
我有以下方法:
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
调用上述方法时,连接数会不断增加。 它不应该一遍又一遍地使用相同的连接(连接池)而不是创建新的连接吗?
尝试增加web.config中的连接字符串中的最大池大小
<add name="ConString" connectionString="SERVER=localhost;DATABASE=databasename;UID=username;PWD=password;Pooling=true;Max Pool Size=100;"/>
或者你定义它的任何地方。解决问题但暂时解决你的代码永久解决方案你可能没有关闭连接
希望它会对你有所帮助
此链接很好地解释了连接池。 如果你想了解整个事情,你应该阅读这个,这是非常好的。
连接池减少了必须打开新连接的次数。 pooler保持物理连接的所有权。 它通过为每个给定的连接配置保持一组活动连接来管理连接。 每当用户在连接上调用Open时,pooler将在池中查找可用连接。 如果池连接可用,则将其返回给调用者,而不是打开新连接。 当应用程序在连接上调用Close时,pooler会将其返回到池化的活动连接集,而不是关闭它。 一旦连接返回到池,就可以在下一个Open调用中重用它。
连接池并不意味着它将重用连接。 由于建立SQL连接的成本很高,因此连接池会保持固定的最大连接数,并且当您在连接上调用.Close()
时,它只会返回到池中,然后池可以将其传递给新连接。在新实例上调用Open()
。
这个机制内置在SqlConnection类中,这就是它对用户透明的原因; 简而言之:只要您正确using
连接(就像这样),您就不必担心打开连接的数量。
填充数据集后尝试关闭连接。 使用statment release对象但它没有关闭连接。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.