net连接池的问题详解

  

来自森大科技官方博客
http://www.cnsendblog.com/index.php/?p=135
GPS平台,网站建设,软件开发,系统运维,找森大网络科技! http://cnsendnet.taobao.com

  

净连接池救生员

  

净连接池救生员

  

防止可淹没应用程序的池溢出

  

威廉·沃恩   

大多数ADO。净数据提供程序使用连接池,以提高围绕微软断开连接的。NET结构构建的应用程序的性能。应用程序首先打开一个连接(或从连接池获得一个连接句柄),接着运行一个或多个查询,然后处理行集,最后将连接释放回连接池。如果没有连接池,这些应用程序将花费许多额外时间来打开和关闭连接。

  

当您使用ADO。净连接池来管理基于Web的应用程序和客户端/服务器Web服务应用程序的连接时,您的客户通常会获得更快的连接和更好的总体性能。但是,当您的应用程序或Web站点上突然涌入了同时希望进行连接的大量客户时,会发生什么事情呢?您的应用程序会“沉”没,还是会“游泳”?就像救生员一样,您需要仔细监视连接池,以维护它的良好性能,并防止连接池发生溢出。我们首先探讨连接池可能溢出的原因,然后讨论如何编写代码或使用Windows性能监视器来监视连接池。

  

正如我于2003年5月发表的“。net连接池游泳”(InstantDoc ID 38356)一文中讨论的那样,当您使用连接池时,您需要知道许多有关可伸缩性和性能的详细信息。请记住,您需要监视和管理两个基本因素:每个池管理的连接数和连接池的数量。在一个有效的生产系统中,池的数量通常很少(1到10),而且,使用中的连接的总数也很少(少于12)有效的查询只用不到一秒钟的时间就可以完成,并断开连接,因此,即使有数百个客户同时访问您的Web站点,相对较少的几个连接常常足以处理整个负载。为了使您的应用程序有效地运行,您必须使连接资源处于自己的控制之下,并要监视池的状态,这样,在监视池发生溢出以及您的客户开始抱怨(或离开您的网站)之前您会收到某种警告。

  

为什么会发生连接池溢出?

  

参加电子邮件讨论组的人常常抱怨应用程序是如何在测试中是“龙”而在形成为产品时就变成了“虫”的。有时,他们会报告说,当连接了大约100个客户端时,应用程序会停止或挂起。请记住,一个池中的默认连接数是100。如果您尝试从池中打开100个以上的连接,ADO。网络会使应用程序的连接请求排队等候,直到有空闲的连接。应用程序(及其用户)将这种情况视为进入Web页的延迟或视为应用程序死锁。让我们首先讨论一下这个问题是如何产生的。

  

在ADO。网中,SqlClient。NET数据提供程序为您提供了两种打开和管理连接的方法,首先,当您需要手工管理连接时,可以使用DataReader对象。利用这种方法,您的代码将构造一个SqlConnection对象,设置ConnectionString属性,然后使用开放的方法来打开连接。当代码完成DataReader后,您要在SqlConnection对象停止作用之前关闭SqlConnection。要处理行集,您可以将DataReader传递到应用程序中的另一个例程,但仍然需要确保DataReader及其连接处于关闭状态。如果您不关闭SqlConnection,代码会“泄漏”每个操作的连接,于是连接池对连接进行累积,最后便发生溢出。与ADO和Visual Basic (VB) 6.0中的情况不同,。净垃圾回收器不会为您关闭SqlConnection并进行清理。我稍后要讨论的清单1显示了如何打开连接和生成DataReader以从一个简单的查询返回行集,来向连接池施加压力的。

  

您也可能在使用DataAdapter对象时遇到问题.DataAdapter填补和更新方法可自动打开DataAdapter对象的连接,并在数据I/O操作完成后关闭该连接,不过,如果该连接在执行填写或更新方法时已经处于打开状态,那么,ADO。净在方法执行完以后不会关闭SqlConnection。这是另一个发生连接“泄漏”的机会。

  

此外,您还可以使用基于COM的ADO从。net应用程序创建连接.ADO利用与ADO。净相同的方式将这些连接组合成池,但不能像您使用SqlClient ADO。净数据提供程序时那样,提供从应用程序监视连接池的方式。

  

指示DataReader   

孤立连接和溢出池是严重的问题,根据有关这些问题的新闻组讨论的数量来看,它们十分常见。这些问题最有可能是由DataReader引起的。为了测试DataReader的行为,我编写了一个Windows窗体(WinForms)示例应用程序,该示例突出了CommandBehavior。CloseConnection选项。(您可以在http://www.sqlmag.com上输入InstantDoc ID 39031来下载此应用程序)。您可以在使用SqlCommand对象的ExecuteReader方法来执行查询并返回DataReader时设定此选项。我的测试应用程序显示,如果不显式关闭DataReader(或SqlConnection),即使使用此选项,连接池还是会溢出。当代码所请求的连接数超过连接池的容量时,该应用程序就会引发异常。

net连接池的问题详解