IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 怎么清空.NET数据库连接池 -> 正文阅读

[大数据]怎么清空.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会发现数据库连接池的数据和我们上面代码执行的结果是一样的。

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-11-16 18:54:27  更:2021-11-16 18:55:40 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 5:44:52-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码