`
shirlly
  • 浏览: 1661301 次
  • 性别: Icon_minigender_2
  • 来自: 福州
社区版块
存档分类
最新评论

.NET程序中对连接池的管理方法

    博客分类:
  • .NET
阅读更多
对于访问量高的系统,每次创建一个连接都会消耗一定的资源,我们可以事先创建好一定数量的连接放入连接池中提供给用户使用,用户使用完后把连接返回连接池,这里我就来说说连接池的管理。
  
  首先,让我们来看看连接池的概念:
  1。连接池允许应用程序从连接池中获得一个连接并使用这个连接,而不需要为每一个连接请求重新建立一个连接。一旦一个新的连接被创建并且放置在连接池中,应用程序就可以重复使用这个连接而不必实施整个数据库连接创建过程。
  2。当应用程序请求一个连接时,连接池为该应用程序分配一个连接而不是重新建立一个连接;当应用程序使用完连接后,该连接被归还给连接池而不是直接释放。
  
  优点:
  1。使用连接池的最主要的优点是性能。
  2。创建一个新的数据库连接所耗费的时间主要取决于网络的速度以及应用程序和数据库服务器的(网络)距离,而且这个过程通常是一个很耗时的过程。而采用数据库连接池后,数据库连接请求可以直接通过连接池满足而不需要为该请求重新连接、认证到数据库服务器,这样就节省了时间。
  
  缺点:
  1。数据库连接池中可能存在着多个没有被使用的连接一直连接着数据库(这意味着资源的浪费)。
  ps:这必须要求开发人员在开发时估计这个系统最大提供的数量是多少。
  
  池的创建和分配
  当连接打开时,将根据一种精确的匹配算法来创建连接池,该算法会使连接池与连接中的字符串相关联。每个连接池都与一个不同的连接字符串相关联。当新连接打开时,如果连接字符串不精确匹配现有池,则将创建一个新池。
  
  在以下示例中,将创建三个新的 SqlConnection 对象,但只需要使用两个连接池来管理这些对象。请注意,第一个和第二个连接字符串的差异在于为 Initial Catalog 分配的值。
  
  SqlConnection conn = new SqlConnection();
  conn.ConnectionString = "Integrated Security=SSPI;Initial Catalog=northwind";
  conn.Open();
  // 连接池A创建了
  
  SqlConnection conn = new SqlConnection();
  conn.ConnectionString = "Integrated Security=SSPI;Initial Catalog=pubs";
  conn.Open();
  // 连接池B创建了,因为ConnectionString与A不匹配
  
  SqlConnection conn = new SqlConnection();
  conn.ConnectionString = "Integrated Security=SSPI;Initial Catalog=northwind";
  conn.Open();
  // 使用A的连接池,因为ConnectionString与A匹配
  
  连接池一旦创建,直到活动进程终止时才会被毁坏。非活动或空池的维护只需要最少的系统开销。
  
  连接的添加
  连接池是为每个唯一的连接字符串创建的。当创建一个池后,将创建多个连接对象并将其添加到该池中,以满足最小池大小的要求。连接将根据需要添加到池中,直至达到最大池大小。
  
  当请求 SqlConnection 对象时,如果存在可用的连接,则将从池中获取该对象。若要成为可用连接,该连接当前必须未被使用,具有匹配的事务上下文或者不与任何事务上下文相关联,并且具有与服务器的有效链接。
  
  如果已达到最大池大小且不存在可用的连接,则该请求将会排队。当连接被释放回池中时,连接池管理程序通过重新分配连接来满足这些请求。对 Connection 调用 Close 或 Dispose 时,连接被释放回池中。
  
  警告  建议使用完 Connection 后始终将其关闭,以便连接可以返回到池中。这可以使用 Connection 对象的 Close 或 Dispose 方法来实现。不是显式关闭的连接可能不会添加或返回到池中。例如,如果连接已超出范围但没有显式关闭,则仅当达到最大池大小而该连接仍然有效时,该连接才会返回到连接池中。
  注意  不要在类的 Finalize 方法中对 Connection、DataReader 或任何其他托管对象调用 Close 或 Dispose。在终结器中,仅释放类直接拥有的非托管资源。如果类不拥有任何非托管资源,则不要在类定义中包含 Finalize 方法。有关更多信息,请参见垃圾回收编程。
  
  连接的移除
  如果连接生存期已过期,或者连接池管理程序检测到与服务器的连接已断开,连接池管理程序将从池中移除该连接。请注意,只有在尝试与服务器进行通信后,才可以检测到这种情况。如果发现某连接不再连接到服务器,则会将其标记为无效。连接池管理程序会定期扫描连接池,查找已释放到池中并标记为无效的对象。找到后,这些连接将被永久移除。
  
  如果存在与已消失的服务器的连接,那么即使连接池管理程序未检测到已断开的连接并将其标记为无效,仍有可能将此连接从池中取出。当发生这种情况时,将生成异常。但是,为了将该连接释放回池中,仍必须将其关闭。
  
  字符串关键字:
  Connection Lifetime 0 当连接返回到池中时,将对它的创建时间和当前时间进行比较,如果时间间隔超过由 Connection Lifetime 指定的值(以秒为单位),则会毁坏该连接。在聚集配置中可以使用它来强制在运行服务器和刚联机的服务器之间达到负载平衡。
  如果值为零 (0),则将使池连接具有最大的超时期限。
  
  Connection Reset 'true' 确定在从池中移除数据库连接时是否将其重置。对于 Microsoft SQL Server 版本 7.0,如果设置为 false,将避免在获取连接时经历一个额外的往返过程,但必须注意的是连接状态(如数据库上下文)不会被重置。
  Enlist 'true' 当为 true 时,如果存在事务上下文,池管理程序将自动在创建线程的当前事务上下文中登记连接。
  Max Pool Size 100 池中允许的最大连接数。
  Min Pool Size 0 池中维护的最小连接数。
  Pooling 'true' 当为 true 时,将从相应的池中取出连接,或者在必要时创建连接并将其添加到相应的池中。
  
  实例代码:
  namespace HowTo.Samples.ADONET
  {
  
  using System;
  using System.Data.SqlClient;
  
  public class connectionpooling
  {
  public static void Main()
  {
  connectionpooling myconnectionpooling = new connectionpooling();
  myconnectionpooling.Run();
  }
  
  public void Run()
  {
  try
  {
  String connString;
  
  // Specification in the connection string:
  // Please note: Pooling is implicit, you automatically get it unless you disable it.
  //       Therefore, "true" is the default for the pooling keyword (pooling=true).
  // Connection Reset:  False
  // Connection Lifetime: 5
  // Enlist:       true
  // Min Pool Size:    1
  // Max Pool Size:    50
  connString = "server=(local)\\NetSDK;Trusted_Connection=yes;database=northwind;" +
  "connection reset=false;" +
  "connection lifetime=5;" +
  "min pool size=1;" +
  "max pool size=50";
  
  SqlConnection myConnection1 = new SqlConnection(connString);
  SqlConnection myConnection2 = new SqlConnection(connString);
  SqlConnection myConnection3 = new SqlConnection(connString);
  
  // Open two connections.
  Console.WriteLine ("打开两个连接。");
  myConnection1.Open();
  myConnection2.Open();
  
  // Now there are two connections in the pool that matches the connection string.
  // Return the both connections to the pool.
  Console.WriteLine ("将两个连接都返回到池中。");
  myConnection1.Close();
  myConnection2.Close();
  
  // Get a connection out of the pool.
  Console.WriteLine ("从池中打开一个连接。");
  myConnection1.Open();
  
  // Get a second connection out of the pool.
  Console.WriteLine ("从池中打开第二个连接。");
  myConnection2.Open();
  
  // Open a third connection.
  Console.WriteLine ("打开第三个连接。");
  myConnection3.Open();
  
  // Return the all connections to the pool.
  Console.WriteLine ("将所有三个连接都返回到池中。");
  myConnection1.Close();
  myConnection2.Close();
  myConnection3.Close();
  }
  catch (Exception e)
  {
  // Display the error.
  Console.WriteLine(e.ToString());
  }
  }
  }
  
  }
分享到:
评论

相关推荐

    SQL Server asp.net 数据提供程序连接池.pdf

    ### SQL Server ASP.NET 数据提供程序连接池:深入解析 #### 概述 SQL Server的ASP.NET数据提供程序连接池机制是提升应用程序性能和可扩展性的关键。连接池通过复用数据库连接,避免了频繁创建和销毁连接所带来的...

    在ASP.NET环境下高效使用SQL Server.NET数据提供程序连接池.pdf

    标题中提到的知识点是关于在***环境下如何高效使用***数据提供程序的连接池。...这将包括对连接池潜在问题的诊断、避免这些隐患的方法,以及如何监控和管理连接池的性能,确保数据库连接的高效和稳定。

    【ASP.NET编程知识】.NET连接池的问题详解.docx

    1. 连接池中的默认连接数限制:在 ADO.NET 中,默认连接池大小为 100 如果您尝试从池中打开 100 个以上的连接,ADO.NET 会使应用程序的连接请求排队等候,直到有空闲的连接。 2. 连接泄漏:如果不关闭 SqlConnection...

    ASP[1].NET与数据库连接池.doc

    ASP.NET数据库连接池是提高...总之,理解并有效管理ASP.NET的数据库连接池对于维持应用程序的性能和可扩展性至关重要。通过监控和优化连接池的使用,可以避免连接池溢出,提高用户体验,确保Web应用程序的稳定运行。

    MySql数据库连接池C#代码(有注释含测试代码)

    MySQL数据库连接池是提高应用程序性能的一种重要技术,它允许开发者管理多个数据库连接并高效地复用这些连接,而不是每次需要时都创建新的连接。在C#编程中,我们可以使用自定义的连接池或者第三方库如ADO.NET的...

    数据库连接池java和.net

    数据库连接池是现代应用程序开发中的重要组成部分,尤其是在Java和.NET框架中。数据库连接池是一种管理数据库连接的技术,它允许多个请求共享有限数量的数据库连接,而不是为每个请求创建新的连接。这种技术大大提高...

    C#高效数据库连接池源码

    数据库连接池是数据库管理中的重要概念,特别是在高并发和大数据量的应用场景下,它能显著提升性能并降低系统资源消耗。在C#编程环境中,我们可以使用自定义的数据库连接池来实现这一功能。本篇文章将深入探讨“C#...

    数据库连接池管理策略

    数据库连接池管理策略是优化数据库应用性能的关键环节。在软件开发中,特别是涉及到与数据库交互的应用,连接池的使用能够显著提升系统效率。本文将详细解释数据库连接池的工作原理、优缺点以及如何进行管理和配置。...

    ADO.NET程序设计模拟题

    10. **SqlConnection连接池**:在ADO.NET中,连接池用于管理数据库连接,提高性能。当两个SqlConnection对象具有相同的连接字符串时,它们会共享同一个连接池。题目中的情况说明即使连接字符串不同(只差了顺序),...

    ADO.net数据库连接示例程序

    连接池管理已打开和关闭的连接,当需要新连接时,它会尝试从池中获取一个已存在的连接。 9. **数据绑定**:ADO.NET数据集可以轻松地与Windows Forms或ASP.NET控件绑定,实现数据展示和用户交互。 以上是ADO.NET...

    设置数据库连接串连接池信息 编程小实例,C++.net源代码编写

    调用`Open()`方法时,ADO.NET会检查连接池,如果连接池中有可用连接,就会复用;如果没有,就会新建一个连接。在完成数据库操作后,我们调用`Close()`方法关闭连接,这个连接将返回到连接池,而不是被立即销毁。 ...

    ADO.NET中SQLServer数据库连接池

    为了使打开的连接成本最低,ADO.NET使用称为连接池的优化方法。连接池减少新连接需要打开的次数。池进程保持物理连接的所有权。通过为每个给定的连接配置保留一组活动连接来管理连接。只要用户在连接上调用Open,池...

    在.NET程序中正确使用String类型

    在.NET程序设计中,String类型是一个非常基础且重要的数据类型,用于表示文本。然而,由于.NET框架对String类型的特殊处理,开发者需要理解其工作原理,才能有效地利用它,避免不必要的性能损失。以下是对String类型...

    .NET Framework SQL Server 数据提供程序连接池

    .NET Framework SQL Server 数据提供程序连接池是ADO.NET中一项重要的性能优化技术,它允许应用程序高效地管理和重用数据库连接,从而提升性能和可扩展性。SQL Server .NET Framework 数据提供程序(SqlClient)自动...

    asp.net测试SQLSERVER连接程序

    ASP.NET是微软开发的一种Web应用程序框架,用于构建动态网站、Web应用和服务。它与SQL Server数据库结合使用,可实现...不过,实际的项目中还需要考虑异常处理、连接池和安全性等问题,以确保系统的稳定性和安全性。

    .NET 数据库连接池

    在实现连接池管理时,还应注意处理DataReader与SqlConnection的关联。如果DataReader没有正确关闭,它会阻止SqlConnection的正确释放,从而导致连接无法返回到连接池。开发者应当在使用完DataReader后,确保通过设置...

    mysql .net 连接驱动

    这是MySQL .NET连接驱动的核心库,包含了所有必要的类和方法,用于建立和管理与MySQL服务器的连接。例如,`MySqlConnection`类用于创建数据库连接,`MySqlCommand`类用于执行SQL命令,`MySqlDataReader`用于读取...

    C# 数据库连接池 C# 数据库连接池

    6. **使用最新的ADO.NET版本**:新版本通常包含性能优化和更好的连接池管理。 总的来说,C#的数据库连接池通过高效地管理和复用数据库连接,显著提高了应用程序的性能和响应速度。理解和正确使用连接池是开发高性能...

    数据库访问技术--ADO.NET程序设计 课后问答题答案

    -ADO.NET程序设计的课后问答题答案,包括连接体系结构、断开连接体系结构、XML Web 服务、ADO.NET 的互用性和可缩放性、DataSet、.NET 数据提供程序、安全模式、连接对象的方法、异常处理、连接池等知识点。...

    1.[创新方法] - 查找.net应用程序中数据库连接泄漏的方法.doc

    在.NET应用程序中,数据库连接泄漏是一个严重的问题,它可能导致数据库连接池耗尽,进而影响整个系统的稳定性和性能。本文将详细介绍一种使用Windbg调试器来查找和定位这种问题的方法。 首先,我们需要理解背景:U9...

Global site tag (gtag.js) - Google Analytics