怎么清空.NET数据库连接池
目录
一、连接池知识背景
在我们的程序中连接数据库是一种耗时的行为,.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会发现数据库连接池的数据和我们上面代码执行的结果是一样的。
相关文章
- 数据孤岛是业务效率的无声杀手
- 2023展望:新的一年将给大数据分析领域带来什么?
- 阿里云ADB基于Hudi构建Lakehouse的实践
- 大数据在医疗保健领域的使用案例
- 微软增加说明:KB5021751 更新扫描已经 / 即将过时 Office 过程中不会触碰用户隐私
- 2022 Gartner全球云数据库管理系统魔力象限发布 腾讯云数据库入选
- 场景化、重实操,分享一个实时数仓实践案例
- Arctic的湖仓一体践行之路
- 分布式计算MapReduce究竟是怎么一回事?
- 淘系数据模型治理优秀实践
- 大数据分析对医疗保健的影响
- 当我们说大数据Hadoop,究竟在说什么?
- 2022年及以后大数据的五个发展趋势
- 网易严选离线数仓治理实践
- 2023 年数据治理趋势
- 一份“靠谱”的年度经营计划,你学会了吗?
- 漫谈对大数据的思考
- 测试一下,读懂数据的能力,你有吗?
- 用艺术的眼光探索数据之美
- 聊聊数据分析成果如何落地