写点什么

怎么清空.NET 数据库连接池

作者:喵叔
  • 2021 年 11 月 15 日
  • 本文字数:1603 字

    阅读完需:约 5 分钟

一、连接池知识背景

在我们的程序中连接数据库是一种耗时的行为,.NET 为了降低打开连接的成本,在 ado.net 中使用了一种叫做连接池的优化技术。使用数据库连接池可以减少打开新连接的次数,并且将物理数据库的连接交给了池程序去做。池程序是通过为每个特定的连接配置保持一组活动的连接对象来管理数据库连接的。每当应用程序发起连接数据库的请求时,池程序就会在连接池中查找是否存在可用的连接,如果有则返回给调用者。当应用程序关闭连接对象时,池程序将连接对象返回到池中, 这个连接可以在下一次发起连接数据库时重用。那么.NET 是如何形成数据库连接池的呢?首先只有相同的连接配置才能被池化,.NET 为不同的配置维护了不同的连接池。这里所说的相同配置必须具有相同的进程、相同的连接字符串以及连接字符串关键 key 顺序相同。连接池中可用连接数量是由连接字符串中的 Max Pool Size 决定的。例如在一个应用程序中数据库连接相关的代码如下:


using (SqlConnection connection = new SqlConnection("Integrated Security=SSPI;Initial Catalog=test1"))  {    connection.Open();} using (SqlConnection connection = new SqlConnection("Integrated Security=SSPI;Initial Catalog=test2"))  {    connection.Open();}    using (SqlConnection connection = new SqlConnection("Integrated Security=SSPI;Initial Catalog=test1"))  {    connection.Open();}  
复制代码


在上面的代码中虽然创建了三个 Connection 对象,但是却只形成了两个数据库连接池。那么连接池中的连接什么时候会被移除呢?答案是连接池中的连接空闲 4-8 分钟后就会被池程序会移除,或者是应用程序进程关闭连接池中的连接也会被移除。

二、清空.NET 连接池

前面简单守卫说了一下连接池相关的内容,现在我们就来看一下如何清空数据库连接池。在.NET 中提供了 ClearAllPools 和 ClearPool 静态方法用于清空连接池。其中 ClearAllPools 表示清空与指定的 DBProvider 相关的所有数据库连接池,ClearPool(DBConnection conn)表示清空与指定连接对象相关的连接池。一般来说我们常用的是 ClearPool(DBConnection conn) 方法。下面我们就使用 ClearPool 方法来演示一下如何清空数据库连接池:


 public class DBHelper {     public string Get()     {         var s = "User ID=root;Password=1qazxsw2;DataBase=test;Server=127.0.0.1;Port=6987;Min Pool Size=5;Max Pool Size=50;CharSet=utf8;";         using (var conn = new MySqlConnection(s))         {             var comm = conn.CreateCommand();             comm.CommandText = "select count(*) from usertest;";             conn.Open();             var ret = comm.ExecuteScalar();             comm.CommandText = "select count(*) from TestTable;";             var len = comm.ExecuteScalar();             return $"查询结果为:{ret} ,连接池的连接对象数量为: {len}";         };     }     public string CP()     {         var s = "User ID=root;Password=1qazxsw2;DataBase=test;Server=127.0.0.1;Port=6987;Min Pool Size=5;Max Pool Size=50;CharSet=utf8;";         using (var conn = new MySqlConnection(s))         {             conn.Open();             MySqlConnection.ClearPool(conn);         };         using (var conn = new MySqlConnection(s))         {             conn.Open();             var comm = conn.CreateCommand();             comm.CommandText = "select count(*) from TestTable;";             var len = comm.ExecuteScalar();             return $"连接池已经清空, 当前查询连接池对象有 {ken}  个";         }     } }
复制代码


我们在 main 函数中调用上面的代码,并查询 mysql 会发现数据库连接池的数据和我们上面代码执行的结果是一样的。

发布于: 2021 年 11 月 15 日阅读数: 6
用户头像

喵叔

关注

还未添加个人签名 2020.01.14 加入

还未添加个人简介

评论

发布
暂无评论
怎么清空.NET数据库连接池