iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >ADO.NET连接池怎么关闭
  • 758
分享到

ADO.NET连接池怎么关闭

2023-06-17 16:06:18 758人浏览 安东尼
摘要

这篇文章主要讲解了“ADO.net连接池怎么关闭”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“ADO.NET连接池怎么关闭”吧!对于ADO.NET连接池,大家不会陌生。不过多次用过ADO.N

这篇文章主要讲解了“ADO.net连接池怎么关闭”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“ADO.NET连接池怎么关闭”吧!

对于ADO.NET连接池,大家不会陌生。不过多次用过ADO.NET连接池的各位.NET程序员,却不一定深入了解它,具体原因是:

ADO.NET中提供了连接池的功能,多数开发人员很少设置它,因为它是默认的。

界面设置如下图:

ADO.NET连接池怎么关闭

关闭连接池也很简单,在连接字符串如下:

Data Source=(local);Initial Catalog=AdventureWorks;Integrated Security=SSPI;Pooling=False;

但连接池的本质是什么样的呢?

用Reflector,打开System.Data.sqlClient.SqlConnection的ConnectionString属性的设置值的方法,如下:

private void ConnectionString_Set(string value)  {      DbConnectionOptions userConnectionOptions = null;      DbConnectionPoolGroup group = this.ConnectionFactory.GetConnectionPoolGroup(value, null, ref userConnectionOptions);      DbConnectionInternal innerConnection = this.InnerConnection;      bool allowSetConnectionString = innerConnection.AllowSetConnectionString;      if (allowSetConnectionString)      {          allowSetConnectionString= this.SetInnerConnectionFrom(DbConnectionClosedBusy.SingletonInstance, innerConnection);          if (allowSetConnectionString)          {              this._userConnectionOptions = userConnectionOptions;              this._poolGroup = group;              this._innerConnection = DbConnectionClosedNeverOpened.SingletonInstance;          }      }      if (!allowSetConnectionString)      {          throw ADP.OpenConnectionPropertySet("ConnectionString", innerConnection.State);      }      if (Bid.TraceOn)      {          string str = (userConnectionOptions != null) ? userConnectionOptions.UsersConnectionStringForTrace() : "";          Bid.Trace("<prov.DbConnectionHelper.ConnectionString_Set|api> %d#, '%ls'\n", this.ObjectID, str);      }  }

再连接 到红色的GetConnectionPoolGroup方法,如下代码

 internal DbConnectionPoolGroup GetConnectionPoolGroup(string connectionString, DbConnectionPoolGroupOptions poolOptions, ref DbConnectionOptions userConnectionOptions)  {      DbConnectionPoolGroup group;      if (ADP.IsEmpty(connectionString))      {          return null;      }      if (!this._connectionPoolGroups.TryGetValue(connectionString, out group) || (group.IsDisabled && (group.PoolGroupOptions != null)))      {          DbConnectionOptions options = this.CreateConnectionOptions(connectionString, userConnectionOptions);          if (options == null)          {              throw ADP.InternalConnectionError(ADP.ConnectionError.ConnectionOptionsMissing);          }          string str = connectionString;          if (userConnectionOptions == null)          {              userConnectionOptions = options;              str = options.Expand();              if (str != connectionString)              {                  return this.GetConnectionPoolGroup(str, null, ref userConnectionOptions);              }          }          if ((poolOptions == null) && ADP.IswindowsNT)          {              if (group != null)              {                  poolOptions = group.PoolGroupOptions;              }              else              {                  poolOptions = this.CreateConnectionPoolGroupOptions(options);              }          }          DbConnectionPoolGroup group2 = new DbConnectionPoolGroup(options, poolOptions) {              ProviderInfo = this.CreateConnectionPoolGroupProviderInfo(options)          };          lock (this)          {              Dictionary<string, DbConnectionPoolGroup> dictionary = this._connectionPoolGroups;              if (!dictionary.TryGetValue(str, out group))              {  Dictionary<string, DbConnectionPoolGroup> dictionary2 = new Dictionary<string, DbConnectionPoolGroup>(1 + dictionary.Count);                  foreach (KeyValuePair<string, DbConnectionPoolGroup> pair in dictionary)                  {                      dictionary2.Add(pair.Key, pair.Value);                  }        dictionary2.Add(str, group2);            this.PerfORManceCounters.NumberOfActiveConnectionPoolGroups.Increment();                  group = group2;                 this._connectionPoolGroups = dictionary2;              }              return group;          }      }      if (userConnectionOptions == null)      {          userConnectionOptions = group.ConnectionOptions;      }      return group;  }

TryGetValue是判断是否存在连接字符串为connectionString的连接,存在返回到group,不存在就调用CreateConnectionOptions创建一个DbConnectionOptions,***用

lock (this)          {              Dictionary<string, DbConnectionPoolGroup> dictionary = this._connectionPoolGroups;              if (!dictionary.TryGetValue(str, out group))              {  Dictionary<string, DbConnectionPoolGroup> dictionary2 = new Dictionary<string, DbConnectionPoolGroup>(1 + dictionary.Count);                  foreach (KeyValuePair<string, DbConnectionPoolGroup> pair in dictionary)                  {                      dictionary2.Add(pair.Key, pair.Value);                  }     dictionary2.Add(str, group2);              this.PerformanceCounters.NumberOfActiveConnectionPoolGroups.Increment();                  group = group2;                  this._connectionPoolGroups = dictionary2;              }              return group;          }

这段代码放到连接池中,在这里,可能显示的看到,ado.NET的连接池实质上是一个Dictionary<string, DbConnectionPoolGroup>泛型集合

所谓的连接池,就是一个与连接对象Connection相关的集合,这不只是简单的集合,而是有一定的机制在内部。我们做开发时,可能建立Connection连接对象,关闭连接对象,有时候还调用Dispose来释放连接。下次再用时,便重新实例化一个连接。但在池中的连接不随连接对象的Close或Dispose而释放。如果下次重新建立连接,连接字符串与前一次完全一模一样,则连接池就会把上次可用的连接对象赋给连接去用。如果两个连接字符串有一点不一样,即使在某一个地方多一个空格,连接池也不会以为是相同的连接,这点微软可能在内部只直接去比较两个字符串了,而不是比较连接数据库字符串的键值互相匹配。

连接池的好处就是保留连接对象,防止下次重头再来实例化一个连接对象。

string constr1 = "Data Source=(local);Initial Catalog=AdventureWorks;Integrated Security=SSPI;";  string constr2 = "Data Source=(local);Initial Catalog=Pubs;Integrated Security=SSPI;";  string ASSMark = "System.Data,Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089";  Assembly ass = Assembly.Load(AssMark);  Type SqlConType = null;  foreach (Type conType in ass.GetExportedTypes())  {      Console.WriteLine(conType .ToString ());      if ("System.Data.SqlClient.SqlConnection" == conType.ToString())      {          SqlConType = conType;      }  }  if (SqlConType != null)  {      Type[] types1 = new Type[0];      ConstructorInfo constructorInfoObj1 = SqlConType.GetConstructor(           BindingFlags.Instance | BindingFlags.Public, null,           CallinGConventions.HasThis, types1, null);      SqlConnection con1 = (SqlConnection)constructorInfoObj1.Invoke(null);      con1.ConnectionString = constr1;                 SqlConnection con2 = (SqlConnection)constructorInfoObj1.Invoke(null);      con2.ConnectionString = constr2;       PropertyInfo PI = SqlConType.GetProperty("PoolGroup", BindingFlags.Instance | BindingFlags.NonPublic);      object poolGroup1 = PI.GetValue(con1, null);      object poolGroup2 = PI.GetValue(con2, null);   }

(说明:可能找到结果后觉得非常简单,但怎么找到结果的,却是费了很大劲,几乎是5个小时,所以相把找到结果的过程简单说一下:

一开始用Reflector发现SqlConnection中有一个PoolGroup的属性,于是就想在运行时候比较两个SqlConnection对象的这个属性,但由于这个属性是的访问修饰符是internal的,不能直接访问,只有用反射,代码(是经过优化的)如下:

然后在倒数***行设置断点,为比较poolGroup1和poolGroup2的不同,结果发现,当连接字符串一样时,这两个对象的_objectID相同,字符串有一点不同就会不同,这点说明连接池中是用字符串本身比较的,而不是字符串中键值对进行比较。同还发现当con1和con2的ConnectionString不赋值时这两个对象都是null,由此说明关键是ConnectionString赋值上,所以才开始用Reflector查看这个属性的赋值方法,才有上面的代码。

感谢各位的阅读,以上就是“ADO.NET连接池怎么关闭”的内容了,经过本文的学习后,相信大家对ADO.NET连接池怎么关闭这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: ADO.NET连接池怎么关闭

本文链接: https://www.lsjlt.com/news/290728.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • ADO.NET连接池怎么关闭
    这篇文章主要讲解了“ADO.NET连接池怎么关闭”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“ADO.NET连接池怎么关闭”吧!对于ADO.NET连接池,大家不会陌生。不过多次用过ADO.N...
    99+
    2023-06-17
  • ADO.NET连接池怎么用
    这篇文章主要为大家展示了“ADO.NET连接池怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“ADO.NET连接池怎么用”这篇文章吧。ADO.NET连接池允许应用程序从连接池中获得一个连接并...
    99+
    2023-06-17
  • ADO.NET连接池是什么
    这篇文章主要讲解了“ADO.NET连接池是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“ADO.NET连接池是什么”吧!知道现在编程什么是最宝贵的?数据库连接,它其实是很耗费资源的。这里...
    99+
    2023-06-17
  • ADO.NET连接池问题怎么解决
    本篇内容介绍了“ADO.NET连接池问题怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一种CS架构的程序,直接把SQL Server...
    99+
    2023-06-17
  • ADO.NET连接池有什么用
    本篇内容主要讲解“ADO.NET连接池有什么用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“ADO.NET连接池有什么用”吧!ADO.NET经过长时间的发展,很多用户都很了解ADO.NET了,这...
    99+
    2023-06-17
  • ADO.Net中怎么利用连接池连接字符串
    ADO.Net中怎么利用连接池连接字符串,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。说了这么多ADO.Net连接池的相关注释,那我们什么时候需要使用到Conn...
    99+
    2023-06-17
  • ADO.NET连接池相关注意问题有哪些
    本篇内容介绍了“ADO.NET连接池相关注意问题有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!ADO.NET连接池是Data Prov...
    99+
    2023-06-17
  • 如何使用ADO.NET中FAQ连接池
    这篇文章将为大家详细讲解有关如何使用ADO.NET中FAQ连接池,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。ADO.NET有很多值得学习的地方,这里我们主要介绍ADO.NET FAQ连接池,包括介绍连接...
    99+
    2023-06-17
  • ADO.NET连接池优缺点有哪些
    这篇文章给大家分享的是有关ADO.NET连接池优缺点有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。ADO.NET中为了提高性能,所以使用了连接池,这样每个请求就不必都创建一个连接,然后认证,然后执行SQL,...
    99+
    2023-06-17
  • ADO.NET连接池有哪些优缺点
    这篇文章主要介绍“ADO.NET连接池有哪些优缺点”,在日常操作中,相信很多人在ADO.NET连接池有哪些优缺点问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”ADO.NET连接池有哪些优缺点”的疑惑有所帮助!...
    99+
    2023-06-17
  • 如何使用DataAdapter优化ADO.NET连接池
    这篇文章主要为大家展示了“如何使用DataAdapter优化ADO.NET连接池”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用DataAdapter优化ADO.NET连接池”这篇文章吧。...
    99+
    2023-06-17
  • 关闭MongoDB连接
    import com.mongodb.Mongo; ... Mongo mongoClient = new Mongo(db,port); ... mon...
    99+
    2024-04-02
  • ADO.NET连接池的原理及其使用方法
    本篇内容主要讲解“ADO.NET连接池的原理及其使用方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“ADO.NET连接池的原理及其使用方法”吧!不要关闭数据库中所有的连接,至少保证ADO.NE...
    99+
    2023-06-17
  • ADO.NET连接事件怎么用
    这篇文章主要介绍ADO.NET连接事件怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!在ADO.NET有一个概念就是事件,所谓的事件就是发生的一次动作,文章这里就ADO.NET连接事件和大家深入细则的谈谈。所有 ...
    99+
    2023-06-17
  • sqlserver怎么关闭数据库连接
    在 SQL Server 中,可以使用以下两种方法关闭数据库连接: 使用 Transact-SQL 语句:可以使用 KILL 命令...
    99+
    2024-04-09
    sqlserver 数据库
  • mongodb怎么关闭数据库连接
    在MongoDB中关闭数据库连接有两种方法。方法一:使用`db.logout()`命令来关闭连接。这会注销当前用户并关闭连接。```...
    99+
    2023-09-06
    mongodb 数据库
  • 关于node+mysql数据库连接池连接
     mysql有两种连接方式:一种是直接连接 另一种是池化连接,我们这篇讲的是池化连接。 为了让解惑,我简答的写份直接连接的代码,如下: var mysql = requi...
    99+
    2023-05-16
    node+mysql node连接mysql
  • PHP关闭 MySQL 连接
    这篇文章将为大家详细讲解有关PHP关闭 MySQL 连接,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。关闭 MySQL 连接:最佳实践 简介 在 PHP 中关闭 MySQL 连接对于释放资源、防止内存泄漏...
    99+
    2024-04-02
  • ADO.NET中怎么连接数据源
    这篇文章将为大家详细讲解有关ADO.NET中怎么连接数据源,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。对于 ODBC .NET Framework 数据提供程序,连接字符串的格式设计为尽可...
    99+
    2023-06-17
  • 相关ADO.NET数据库是怎样连接调试
    这期内容当中小编将会给大家带来有关相关ADO.NET数据库是怎样连接调试,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。ADO.NET数据库 开发内容包括:更容易的设计集成、扩充的部署选项、更为丰富多彩的登...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作