技术开发 频道

ADO.NET数据连接池



【IT168 技术文档】

    2、有多少个连接池 

    Data Provider为每个进程管理该进程的连接池,一个进程可以有一个或者多个连接池。Data Provider是根据什么来决定是建立新的连接池还是使用已有的连接池呢?根据数据库连接串。怎样才算是相同的连接串?连接串的字符完全相同?答案为是但也不是。 

    笔者看过有些文章说不一定两个连接串的字符完全相同才算是相同的连接池,例如 "server = .;database = northwind;user = sa;password = sqlserver"与 "server = .;database = northwind; password = sqlserver; user = sa”是相同的连接串。但笔者测试过,Data Provider为以上两个连接串建立两个连接池,证明它们并不是相同的连接串。其实,笔者认为,对于“两个连接串参数相同但顺序不同”,“两个连接串只差一个空格”是否是相同的连接串等问题不需要理会,因为保证两个连接池的字符完全相同是没有难度的事。 

    如果你需要相同的连接串,首先你保证两个连接串每一个字符都相同,但这还不能保证Data Provider只为你建立一个连接池。因为如果你使用Windows认证,那么即使使用相同的连接串"server = .;database = northwind;trusted_connection = true”也有可能建立多个连接池。Windows认证意味着连接数据库使用的数据库用户是运行打开数据库连接Open()的当前用户,如果运行该代码的用户不是固定的话,那么即使每次都使用相同字符的连接串也会产生多个连接池。 

    连接池建立后直到它所属的进程结束才会被销毁。 

    3、一个连接池里有多少个连接 

    明白了怎么区分不同的连接池后,下面我们来看看一个连接池里有多少个连接。一个连接池里的连接数不是静态的数量,它会随着连接池的不同状态而改变。这就涉及连接池建立的时候有多少个连接,什么时候连接会减少,什么时候会增加,连接数的上限是多少等问题。 

    首先来看看能影响连接池里连接数的连接串参数,如下表所示。

参数 默认值  描述
Min Pool Size 0 连接池一旦建立后,池里连接数量的最小值。
Max Pool Size 100 连接池里连接数量的最大值。
Connection Lifetime 0 每当一个连接使用完后释放回连接池,如果当前时间减去该连接建立的时间的值大于这个参数设定的值(秒),该连接被销毁。0表示lifetime没有上限。
Connection Timeout 15 连接请求停止请求并产出错误前等待的时间。当池的连接数达到Max Pool Size而且全部被占用,连接请求需要等待“被占用的”连接被释放回连接池,如果等待超过指定的时间还没有连接被释放就抛出InvalidOperationException。

0
相关文章