如果System.Data.SQLClient.SqlConnection(下面简称dbconn)不及时Close,那么造成的后果可以在这里看到:http://www.cnblogs.com/juqiang/archive/2005/12/10/294269.html

具体的原因,我们来看代码(用reflector反编译.net framework 2.0的dll)

dbconn有一个方法叫做:Open,部分代码如下:
 1System.Data.SQLClient.SqlConnection在Open之后为什么需要及时Close? try
 2
注意上面的第4行,this.InnerConnection.OpenConnection(thisthis.ConnectionFactory);这里的this.ConnectionFactory是一个DbConnectionFactory类型,定义在class SqlConnection中
System.Data.SQLClient.SqlConnection在Open之后为什么需要及时Close?static SqlConnection()
}
在看第一段代码的第4行,这里用InnerConnection来进行OpenConnection,那么InnerConnection的类型,我们可以从下面看到:
System.Data.SQLClient.SqlConnection在Open之后为什么需要及时Close?public SqlConnection()
}
它是一个DbConnectionClosedNeverOpened类型(具体做啥的,我们不管),它的基类是:DbConnectionClose。ok,确定好上述两个类型后,我们就看一下OpenConnection的代码:(class DbConnectionClosed)
 1System.Data.SQLClient.SqlConnection在Open之后为什么需要及时Close?  try
 2        }
看一下第4行,哈,这里绕到了我们上面的conn factory,我们看它里面的GetConnection怎么写的?(class DbConnectionFactory)
 1System.Data.SQLClient.SqlConnection在Open之后为什么需要及时Close?internal DbConnectionInternal GetConnection(DbConnection owningConnection)
 2}
注意第5行里面的GetConnectionPool的调用,继续看它内部的代码:(class DbConnectionFactory)
 1System.Data.SQLClient.SqlConnection在Open之后为什么需要及时Close?private DbConnectionPool GetConnectionPool(DbConnection owningObject, DbConnectionPoolGroup connectionPoolGroup)
 2}
注意第9行,我们go on...(Class DbConnectionFactory)
 1System.Data.SQLClient.SqlConnection在Open之后为什么需要及时Close?        if ((poolOptions == null&& ADP.IsWindowsNT)
 2
依然是第9行(枯燥的数字。。。),继续往里面看:(Class DbConnectionFactory)
System.Data.SQLClient.SqlConnection在Open之后为什么需要及时Close?protected override DbConnectionPoolGroupOptions CreateConnectionPoolGroupOptions(DbConnectionOptions connectionOptions)
}
看最后一行,调用了一个new操作,注意里面的参数!有MaxPoolSize,MinPoolSize等属性。而这些重要属性是从str,即SqlConnectionString的一个property(Class DbConnectionPool,快到终点了,坚持一下。。。)
  1System.Data.SQLClient.SqlConnection在Open之后为什么需要及时Close?internal SqlConnectionString(string connectionString) : base(connectionString, GetParseSynonyms(), false)
  2);
===============================其他代码省略========================================
}
这段代码很长,但是我们注意上面的第17行,这里有一个默认值100,就是说,如果你没有在connection string中指定max pool size,那么该值就是100。
那么,如果我们代码中对于dbconn进行了Open,没有进行Close,conn pool就会一直增长,一直涨到100,涨到这个Max Pool Size。原因我们看下面:(Class DbConnectionPool)
 1System.Data.SQLClient.SqlConnection在Open之后为什么需要及时Close?            case 2:
 2System.Data.SQLClient.SqlConnection在Open之后为什么需要及时Close?                Bid.PoolerTrace("<prov.DbConnectionPool.GetConnection|RES|CPOOL> %d#, Creating new connection.\n"this.ObjectID);
 3System.Data.SQLClient.SqlConnection在Open之后为什么需要及时Close?                try
 4
注意上面的第5行,UserCreateRequest,看这个方法:
System.Data.SQLClient.SqlConnection在Open之后为什么需要及时Close?private DbConnectionInternal UserCreateRequest(DbConnection owningObject)
}
上面的代码很清楚的表明,如果count>=MaxPoolsize,会返回一个internal2,而这个field是一个Null!从其他的地方,我们也能找到类似的判断。

上面写了这么多,结论就是,如果dbconn在Open之后,没有Close,那么会造成conn个数上涨,到100之后就会停下来。第101个链接的请求,是无法创建成功的。这样,db和web server很可能都是CPU很低,如0%,但是客户端的响应时间就是很长,造成性能下降。

相关文章:

  • 2022-12-23
  • 2021-04-07
  • 2022-01-08
  • 2021-03-31
  • 2021-09-03
  • 2021-09-26
  • 2021-07-28
  • 2021-06-03
猜你喜欢
  • 2021-08-16
  • 2022-01-07
  • 2022-03-07
  • 2022-03-08
  • 2021-10-03
  • 2021-09-28
  • 2022-12-23
相关资源
相似解决方案