数据库连接池

来源:互联网 发布:手机我要开淘宝网店 编辑:程序博客网 时间:2024/06/07 05:42

        今天,在一本关于大型网站技术架构的书中看到了关于服务端性能优化方面的知识,有一方面是使用数据库连接池。突然想想自己在从事的编程工作中都是以实现业务为主,对数据访问层越来越无知了。所以抽时间看了下 Ado.Net的数据库连接池。在此分享下,希望对大家有帮助。

        首先,程序创建数据库连接是比较耗时耗资源的工作,之所以会这样,是因为连接到数据库服务器需要经历几个漫长的过程:建立物理通道(例如套接字或命名管道),与服务器进行初次握手,分析连接字符串信息,由服务器对连接进行身份验证,运行检查以便在当前事务中登记等等。

         连接池就是这样一个容器:它存放了一定数量的与数据库服务器的物理连接。因此,当我们需要连接数据库服务器的时候,只需去池(容器)中取出一条空闲的连接,而不是新建一条连接。这样的话,我们就可以大大减少连接数据库的开销,从而提高了应用程序的性能。

         那么作为一个C#开发人员怎么使用数据库连接池呢?实际上,ADO.NET已经为我们提供了连接池,默认是使用连接池的。

         需要说明的是,连接池是具有类别区分的。也就是说,同一个时刻同一应用程序域可以有多个不同类型的连接池。那么,连接池是如何标识区分的?细致的讲,是由进程、应用程序域、连接字符串以及windows标识(在使用集成的安全性时)共同组成签名来标识区分的。但对于同一应用程序域来说,一般只由连接字符串来标识区分。当打开一条连接时,如果该条连接的类型签名与现有的连接池类型不匹配,则创建一个新的连接池。反之,则不创建新的连接池。

下面是3个连接,根据Initial Catalog的字符串不同,会创建不同的连接池。

<span style="font-size:12px;">//创建连接对象1using (SqlConnection conn1 =             new SqlConnection(  "DataSource=(local);Integrated Security=SSPI;Initial Catalog=Northwind"))    {            conn1.Open();       }//创建连接对象2using (SqlConnection conn2 =           new SqlConnection(  "DataSource=(local);Integrated Security=SSPI;Initial Catalog=pubs"))   {           conn2.Open();      }//创建连接对象3using (SqlConnection conn3 =         new SqlConnection(  "DataSource=(local);Integrated Security=SSPI;Initial Catalog=Northwind"))  {            conn3.Open();      }</span>
连接池的分配原理

  当用户创建连接请求或者说调用Connection对象的Open时,连接池管理器首先需要根据连接请求的类型签名找到匹配类型的连接池,然后尽力分配一条空闲连接。具体情况如下:

  • 如果池中有空闲连接可用,返回该连接。
  • 如果池中连接都已用完,创建一个新连接添加到池中。
  • 如果池中连接已达到最大连接数,请求进入等待队列直到有空闲连接可用。

移除无效连接 

      无效连接,即不能正确连接到数据库服务器的连接。对于连接池来说,存储的与数据库服务器的连接的数量是有限的。因此,对于无效连接,如不及时移除,将会浪费连接池的空间。其实你不用担心,连接池管理器已经很好的为我们处理了这些问题。如果连接长时间空闲,或检测到与服务器的连接已断开,连接池管理器会将该连接从池中移除。

回收使用完的连接

      当我们使用完一条连接时,应当及时关闭或释放连接,以便连接可以返回池中重复利用。我们可以通过Connection对象的Close或Dispose方法,也可以通过C#的using语句来关闭连接。(这些是写代码的规范)

几个非常重要属性

连接池的行为可以通过连接字符串来控制,主要包括四个重要的属性:

  • Connection Timeout:连接请求等待超时时间。默认为15秒,单位为秒。
  • Max Pool Size: 连接池中最大连接数。默认为100。
  • Min Pool Size: 连接池中最小连接数。默认为0。
  • Pooling: 是否启用连接池。ADO.NET默认是启用连接池的,因此,你需要手动设置Pooling=false来禁用连接池。
其实我们使用ADO.NET,程序已经默认为我们使用了数据库连接池,此篇文章主要是描述数据库连接池的原理和使用细节。对于数据库连接池的学习,可以为我们在别的程序设计上做一个借鉴。

0 0
原创粉丝点击