今日总结

2020年11月7日:

关于数据库连接池:

 一、什么是连接池?

     建立一个数据库连接是一件非常耗时耗力的事情。之所以会这样,是因为连接到数据库服务器需要经历几个漫长的过程:建立物理通道,与服务器进行初次握手,分析连接字符串信息,由服务器对连接进行身份验证,运行检查以便在当前事务中登记等等。我们先不管为什么会有这样的机制,存在总是有它的道理。既然新建一条连接如此痛苦,那么为什么不重复利用已有的连接呢?

     实际上,ADO.NET已经为我们提供了名为连接池的优化方法。连接池就是这样一个容器:它存放了一定数量的与数据库服务器的物理连接。因此,当我们需要连接数据库服务器的时候,只需去池中取出一条空闲的连接,而不是新建一条连接。这样的话,我们就可以大大减少连接数据库的开销,从而提高了应用程序的性能。

     二、连接池的工作原理

     2.1 创建连接池

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

//创建连接对象1
using (SqlConnection conn1 = new SqlConnection(  "DataSource=(local);Integrated Security=SSPI;Initial Catalog=Northwind"))    
{        
    conn1.Open();       
}

//创建连接对象2
using (SqlConnection conn2 = new SqlConnection(  "DataSource=(local);Integrated Security=SSPI;Initial Catalog=pubs"))   
{       
    conn2.Open();      
}

//创建连接对象3
using (SqlConnection conn3 = new SqlConnection(  "DataSource=(local);Integrated Security=SSPI;Initial Catalog=Northwind"))  
{        
    conn3.Open();      
}

     2.2 分配空闲连接

     当用户创建连接请求或者说调用Connection对象的Open时,连接池管理器首先需要根据连接请求的类型签名找到匹配类型的连接池,然后尽力分配一条空闲连接。具体情况如下:
         1)如果池中有空闲连接可用,返回该连接。
         2)如果池中连接都已用完,创建一个新连接添加到池中。
         3)如果池中连接已达到最大连接数,请求进入等待队列直到有空闲连接可用。

     2.3 移除无效连接

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

     2.4 回收使用完的连接

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

原文地址:https://www.cnblogs.com/yitiaokuailedexiaojingyu/p/14122264.html