简述ADO.NET中的连接池

      在以前使用SqlConnection时,一直都是在用来进行与数据存储区进行通信并且用于创建命令和开启一个当前连接的事务.但是从来没有静下心来想过SqlClient .NET数据提供程序是怎样使用连接与数据库进行通信,并且是通过何种方式提高在打开数据存储区的连接时提高应用程序的性能的.

      今天想借此机会也写一段关于连接池的心得,以此帮助那些和我一样处在初级使用SqlClient .NET 数据提供程序的朋友们.希望您在读完后能够从中得到一点帮助!

      什么是连接池---打开数据存储区的连接时提高应用程序性能的一种机制.

      关于连接池简要概述:

        <1>连接池是一种对应连接的专用池,池的作用都差不多,为了能重用造价昂贵的对象,常见的有连接池和线程池
连接池的基本原理就是由池来管理数据库连接(数据库连接是造价昂贵的对象,频繁开启新连接会很难忍受).

        [以上文字由weberwong提供:感谢支持]

      ADO.NET默认情况下启用连接池,也可通过手动方式进行设置(SqlConnection.Pool = false)为不启动连接池.通过调用SqlConnection.Open方法可以将该连接关联至数据库,并尝试使用该字符串和凭据进行与数据库进行通信.或许在进行调用SqlConnection.Close方法时,也许您会想我是否已经将连接与数据库之间的通信已经关闭(这种想法我在初期也有同感). 但是,这种想法的的确确是错了,因为在进行调用SqlConnection.Close方法时,此时SqlClient数据提供程序已经将该内部连接存储到池中,而不是关闭.以便在以后重复使用.

      什么是内部连接?从结构上讲内部连接是一个建立在数据库之上的非常薄的层.可以将其想象成与数据库进行交互的更底层的对象.也就是说当我们创建一个连接后,对连接进行的打开,关闭其实都是利用内部连接与数据库进行来往.换句话说,即使连接被处理掉以后,其内部连接有可能依然保留在池中.当以后使用相同的连接字符串和凭据进行打开一个新的连接时,将从池中取出相同的内部连接以供使用.

      下面我通过编写一段代码来阐述关于ADO.NET中启用连接池的优势:

为了能够更好的反映出在启用连接池的优点,我们可以利用在using代码段内创建一个短期生存对象,并且存储该连接的InnecConnection属性的值.通过比较两次不同的InnerConnection属性的值可以得出:如果使用了同一"内部连接"则证明的的确确是在ADO.NET中启用了连接池.从而最终达到减少资源使用,并能更快速的与数据库进行通信.(以下代码中需要利用反射技术使我们能够更加清楚的看到在连接被处理掉之后依然能够在以后使用时从连接池中取出内部连接).

 

 

  

 

 

在using代码段的末尾都隐式的将连接处理掉,相反并没有将InnerConnection的属性以及所封装的物理连接处理掉,可以从最后的输出得出此结论.

通过以上的代码测试,可以大致得出结论:ADO.NET确实启用了连接池,并且我们也从中体会到使用连接池的好处.

好处在那里?也许您可能会问到此类问题:

让我们设想一下这样一个场景,客户端应用程序执行一条查询命令,服务器代码大致经过以下几个步骤:

 1.>登录到数据库,并且完成验证工作;

 2.>执行相关查询;

 3.>注销该连接;

可能在一个应用程序中类似这样的连接(连接字符串和凭据相同),可能存在很多.如果每个连接都需要从头按部就班的执行的话,是不是影响了代码的性能以及执行效率?那么有了连接池之后,情况将大为改观.虽然调用SqlConnection.Close方法之后,对SqlConnection进行处理,但并不影响内部连接,只是将其存储在连接池中.从而提高了应用程序的执行的性能.

 

连接池应用的喜与忧:

      我们知道使用连接池可以提高应用程序的代码的性能以及相应速度,但是这种机制也导致了在任意给定时刻存在多个活动的连接的问题.为了避免此问题的发生我们通常的做法是:在连接字符串使用Pooling = False进行设置.对于每个打开的连接都会创建一个新池.同时避免了上述问题的发生.问题至此解决了吗,显然是没有.虽然我们避免了在某个时刻池中存在多个连接的问题,但是我们也因此付出了较大的代价.因此,

在这个问题上我们要根据需要谨慎对待.

 

关于连接池中不得不知的Connection Reset存储过程:

     如果仔细观察过SQL 事件探查器您会发现一个名为sp_reset_connection的存储过程,但是您曾想过这个存储过程是在何时运行的以及为何运行?

     带着问题读完以下部分时,相信您已然明白了许多.(如果您对此问题有您独到的见解,请不要吝啬,留下您的脚步,请您给予指导.)

     简单的重复使用池中的连接时将会产生预料不到的结果.由于没有更合适的术语来进行解释,所以只能说:"存在一个与已缓存的连接相关的<残余>".对于程序员来说,不可能将每个连接的结束处对该连接的<残余>进行清除,使其恢复到初始状态.

     在ADO.NET 2.0中,上述问题已经替我们解决掉了.SqlClient .NET数据提供程序跟踪那些SqlConnection从连接池提取的连接.当调用Open方法时,SqlClient并没有执行sp_reset_connection存储过程,而是该连接的第一个操作前执行该查询.这样一来省区了我们自行清除的麻烦.

 

有了上述机制的保证使ADO.NET在池中查找匹配的内部链接奠定了稳定而高效的基础.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值