在上一篇中简单讨论了SqlConnection的正确使用方式,顺带浅谈了一下连接池,不小心带出了一个问题:SqlConnection的Close和Dispose方法执行之后,该连接对象是不是真的放回到池中并且可以复用?

今天上午我抽空看了一下SqlConnection的Close和Dispose的IL代码,看完之后并没有直接打消我的疑惑,反而让我更加不确定。

今晚又仔细看了下文中的回复,非常汗颜,感觉自己基础还是不太扎实,同时又有点小怀疑。

这里尤其感谢园友rdlc2和荒原上的军旗的回复,他们的不吝赐教直接给了我启发,今晚又写了一段简单的测试代码:

     static void Execute(){SqlConnection conn = new SqlConnection(sqlConnString);conn.Open();Console.WriteLine("Current Connection State:{0}", conn.State);conn.Close();Console.WriteLine("Current Connection State:{0}", conn.State);Thread.Sleep(100);conn.Open();Console.WriteLine("Current Connection State:{0}", conn.State);conn.Close();Console.WriteLine("Current Connection State:{0}", conn.State);Thread.Sleep(100);conn.Open();Console.WriteLine("Current Connection State:{0}", conn.State);conn.Dispose();Console.WriteLine("Current Connection State:{0}", conn.State);Console.WriteLine("Current Connection String:{0}", conn.ConnectionString);Thread.Sleep(100);try{//conn.ConnectionString = sqlConnString; //加上这一行,Open可以正常执行conn.Open();//异常:ConnectionString没有初始化 Console.WriteLine("Current Connection State:{0}", conn.State);}catch (Exception ex){Console.WriteLine(ex.ToString());}finally{if (conn.State == ConnectionState.Open){conn.Close();}Console.WriteLine("Current Connection State:{0}", conn.State);}}

执行结果正如注释所写,在调用Dispose之后,SqlConnection的ConnectionString属性变为String.Empty了。

而在MSDN上,关于连接池的创建和分配是这么说的:

在初次打开连接时,将根据完全匹配算法创建连接池,该算法将池与连接中的连接字符串关联。每个连接池都与一个不同的连接字符串相关联。打开新连接时,如果连接字符串并非与现有池完全匹配,将创建一个新池。按进程、应用程序域、连接字符串以及 Windows 标识(在使用集成的安全性时)来建立池连接。连接字符串还必须是完全匹配的;按不同顺序为同一连接提供的关键字将分到单独的池中。

也就是说,连接池的一个重要特性是根据连接字符串来划分该连接到底属于哪一个池。那么对于Dispose执行后连接字符串为空的连接对象它会归到哪一个池中呢?也许这个对象是真的放回到某一个池中,但是到底微软的连接池做了怎样的内部处理,比如连接字符串是怎么重新分配的呢?Dispose真的和Close方法执行效果一样吗?

反正我现在还是将信将疑。

说出你的看法吧。

SqlConnection调用Dispose方法之后还可以在连接池中复用吗?相关推荐

  1. Go http client 连接池不复用的问题

    当 http client 返回值为不为空,只读取 response header,但不读 body 内容就执行 response.Body.Close(),那么连接会被主动关闭,得不到复用. 测试代 ...

  2. 浅谈各种连接池中连接数量的设置

    连接池中连接数量的配置 我们日常开发中经常会用到各种连接池,比如httpclient和jediscluster以及druid等数据库连接池,当使用这些连接池的时候我们总是很疑惑到底要怎么配置连接池中连 ...

  3. evt参数是干啥用的_http连接池中非常关键的两个参数,到底是干啥用的?

    作者简介:大厂一线资深开发.从crud开发到资深开发,再到研究员兼技术经理.<资深开发讲技术> 从一线实战中总结有故事,有背景的案例,希望带给大家一系列技术盛宴. 求关注,欢迎技术交流.友 ...

  4. 第三十三期:连接池中非常关键的两个参数,到底是干啥用的?

    说来惭愧,从事互联网开发好些年了,有些概念一直没有彻底搞清楚.其中之一就是,ttp client配置连接池的时候,maxConnectionsPerHost,和maxTotalConnections, ...

  5. oracle conneciton properties,在WAS Liberty连接池中,我可以验证借用连接吗?

    我们当前正在将应用程序迁移到Liberty服务器(8.5.5.9)上运行.我们发现应用程序服务器和数据库之间的连接偶尔会被防火墙终止,因为它们会在很长一段时间内处于空闲状态.发生这种情况时,在下一个H ...

  6. 【连接池】Tomcat 连接池中 maxActive,maxWait,maxAge,testOnBorrow,testWhileIdle等选项的作用

    前言 连接池本质作用是为客户端提供连接复用,提升连接效率,降低系统开销.Tomcat的连接池提供了maxActive,maxWait,maxIdle,minIdle,initialSize等参数,配置 ...

  7. windows 中 vpn连接提示, 虚拟专用网络 由于RAS/虚拟专用网络,服务器上配置的某个策略,服务器用于验证用户名和密码的身份验证方法可能与连接配置文件中的身份证验证方法不匹配

    windows 虚拟专用网络 由于RAS/虚拟专用网络,服务器上配置的某个策略,服务器用于验证用户名和密码的身份验证方法可能与连接配置文件中的身份证验证方法不匹配 打开网络 更换网络适配器 选项 右键 ...

  8. 连接池中的最大连接数和最小连接数

    maximum-connection-count 最大连接数, minimun-connection-count 最小连接数 proxool 是一个连接池,池中放了多个连接对象,这两个值设置连接对象数 ...

  9. 连接池中 maxActive,maxWait,maxAge,maxIdel参数

    前言 连接池本质作用是为客户端提供连接复用,提升连接效率,降低系统开销.Tomcat的连接池提供了maxActive,maxWait,maxIdle,minIdle,initialSize等参数,配置 ...

最新文章

  1. Python五种实用的小技巧
  2. 计算机视觉大规模爆发,6大细分领域将撑起725亿元市场
  3. (四)OpenStack---M版---双节点搭建---Glance安装和配置
  4. 显卡mx150和230哪个好_MX250显卡等于GTX1050?笔记本显卡MX250和MX150的区别对比
  5. UA MATH566 统计理论 QE练习题1
  6. 张首晟:量子计算、人工智能与区块链
  7. Python----面向对象---自定义元类控制类的实例化行为的应用
  8. stl源码分析de练习
  9. vr的延迟和渲染效率优化与Nvidia VRWorks
  10. AVR 定点数运算程序设计及数制转换
  11. 【论文解读】AAAI 2020 持续学习语义理解框架ERNIE 2.0
  12. bzoj 1119 [POI2009] SLO bzoj 1697 牛排序 —— 置换+贪心
  13. js距离单位换算_在线单位换算器
  14. Stata: 实时估计个股贝塔(beta)系数
  15. 集成百度街景报错Error inflating class com.baidu.lbsapi.panoramaview.PanoramaView
  16. <论文阅读>CRaft
  17. 语音信号的短时平均过零率
  18. 企业邮箱是什么?企业邮箱如何免费申请?外贸公司邮箱申请
  19. 基于区块链的数据透明化:问题与挑战 Blockchain-Based Data Transparency: Issues and Challenges
  20. Embedded Linux S3C2440 Profiling

热门文章

  1. antd树型选择控件选择父级_element的tree树形菜单回显、父级半勾选
  2. 苹果鼠标怎么充电_双十一苹果无线充电宝怎么选?充电兼容性强的品牌推荐_...
  3. mysql 主从 索引_Mysql繁忙主从库在线修改表结构与添加索引问题
  4. c语言trunc函数是什么意思,C ++中是否有trunc函数?
  5. 怎么保存php格式,把php代码保存到php文件实现方法
  6. mysql开启 pscache_Druid连接池在mysql的场景PS Cache是否需要开启?
  7. 大学java怎么算学得好_为什么现在大学里很多计算机系的大学生,学编程的时候总学不好...
  8. 分析频域滤波和空域滤波的各自特点_同态滤波原理及其matlab实现
  9. pycocotools/_mask.c:no such file or directory
  10. 深度学习理论 10集课程视频(斯坦福 STATS 385)