一,连接池的概念
• 连接池是处于一个进程
连接池控制多个连接,这多个连接必须是在一个进程之中,重用也是在同一个进程中重用
(从服务器端角度讲,实际上一个应用程序还会包含多个应用程序域,一个应用程序域中可能包含多个连接池,appdomain)
asp.NET里如果连接池程序寄存在IIS中,是基于底层数据库访问组件之上的
• 该进程保存连接并使其处于活动状态,使连接可以被重复使用
示例场景:在DB上层,创建webservice 在其中创建连接池,减轻DB压力
二,不使用连接池的DB连接建立过程
• 连接到数据源
–建立物理通道(例如套接字或命名管道,网络连接)
– 与服务器进行初次握手
–分析连接字符串信息
– 由服务器对连接进行身份验证
– 运行检查以便在当前事务中登记
没有连接池的时候,要做的工作很多,每次都新建连接,浪费很多时间
实际上大型应用,不仅仅DB建立连接池,普通对象也可以建立对象池
三,连接池的好处
• 通过数据库连接池,应用程序可以重用池中现有的连接,而不必反复与数据库建立新的连接。
• 使用连接池可显著提高应用程序的可伸缩性,因为有限数量的数据库连接可以为数量大得多的客户端提供服务。
• 同时,由于可以节省建立新连接所需的大量时间,使用连接池还能够改善性能。
• 对于应用程序来说是透明的
四,连接池工作原理及过程
• Pooling 参数为true 时,连接池启用(连接字符串中设置,默认也为true)
• 两个连接的连接字符串相同时,被放置在一个连接池中
• 两个连接的连接字符串不同时,被放置在不同的连接池中
• 连接被Close 时,连接被放置在连接池中以备重用
• 连接被Dispose 时,连接被彻底删除
• 连接池最后一个连接被Close 时,连接池被删除
五,控制SQL Server 连接池
SQL Server 连接池有关的连接字符串变量
• Connection Lifetime 连接生存期默认值0 (设置为0,保证生命周期是最大的,不会退出)
• Connection Reset 连接重置默认值True
(保证每次连接数据库时,取得字符串中指定的新的连接,
否则会定向到别的数据库中.比如,在创建连接之前执行了 use【其他的数据库】的情况 )
• Enlist 登记默认值True(和事务相关)
• Max Pool Size 最大池大小默认值100
• Min Pool Size 最小池大小默认值0
• Pooling 池默认值True(是否启用连接池)
注意1※ 保证一致
• 连接是通过连接字符串上的完全匹配算法进行池化的。
• 池机制甚至对名称-值对之间的空格也敏感
注意2※ 关闭连接
• 使用完连接后,立即显示关闭连接
• 不要在类的Finalize方法中关闭连接
– 因为它在垃圾回收时才会执行
–很有可能会造成连接池已满
• DataAdapter在之前显式打开的连接不会自
动关闭,必须显示关闭
只有自动打开的才会自动关闭
注意3※ 连接池的驻留问题
• 如果MinPoolSize 在连接字符串中未指定或指定为零,池中的连接将在一段时间不活动后关闭。
• 如果指定的MinPoolSize 大于零,在AppDomain 被卸载并且进程结束之前,连接池不会被破坏。
• 非活动或空池的维护只需要最少的系统开销。
注意4※ 手动清除连接池
• ClearAllPools
– 清除给定提供程序的连接池。
• ClearPool (参数sqlConnection, 通过连接字符串比较查找)
– 清除与特定连接关联的连接池。
– 如果在调用时连接正在使用,将进行相应的标记。连接关闭时,将被丢弃,而不是返回池中。
注意5※ 池碎片
• 池碎片是许多Web 应用程序中的一个常见问题,应用程序可能会创建大量在进程退出后才会释放的池。
这样,将打开大量的连接,占用许多内存,从而影响性能。
– 因为集成安全性产生的池碎片(连接用户不同,创建不同的进程)
– 因为许多数据库产生的池碎片