分类

  • 软件天地

  • .NET程序中对连接池的管理方法‖
    数量的连接放入连接池中提
    连接池的管理。
    每次创建一个连接都会消耗一定
    供给用户使用,用户使用完后把

    的资源,我们可以事先创建好一定
    连接返回连接池,这里我就来说说


      首先,让我们来看看连接池的概念:                                              
      1。连接池允许应用程
    接请求重新建立一个连接。
    复使用这个连接而不必实施
    序从连接池中获得一个连接并使
    一旦一个新的连接被创建并且放
    整个数据库连接创建过程。
    用这个连接,而不需要为每一个连
    置在连接池中,应用程序就可以重

      2。当应用程序请求一
    连接;当应用程序使用完连
    个连接时,连接池为该应用程序
    接后,该连接被归还给连接池而
    分配一个连接而不是重新建立一个
    不是直接释放。

      优点:

      1。使用连接池的最主要的优点是性能。                                          
      2。创建一个新的数据库连接所耗费
    服务器的(网络)距离,而且这个过程通
    据库连接请求可以直接通过连接池满足而
    样就节省了时间。
    的时间主要取决于网络的速度以及应用程序和数据库
    常是一个很耗时的过程。而采用数据库连接池后,数
    不需要为该请求重新连接、认证到数据库服务器,这


      缺点:

      1。数据库连接池中可能存在着多个
    的浪费)。
    没有被使用的连接一直连接着数据库(这意味着资源

      ps:这必须要求开发人员在开发时估计这个系统最大提供的数量是多少。            

      池的创建和分配

      当连接打开时,将根据
    字符串相关联。每个连接池
    符串不精确匹配现有池,则
    一种精确的匹配算法来创建连接
    都与一个不同的连接字符串相关
    将创建一个新池。
    池,该算法会使连接池与连接中的
    联。当新连接打开时,如果连接字


      在以下示例中,将创建三个新的 Sql
    这些对象。请注意,第一个和第二个连接
    Connection 对象,但只需要使用两个连接池来管理
    字符串的差异在于为 Initial Catalog 分配的值。


      SqlConnection conn =
    new SqlConnection();
      conn.ConnectionStrin
    g = "Integrated Security=SSP
    I;Initial Catalog=northwind";
      conn.Open();                                                      
      // 连接池A创建了                                                          


      SqlConnection conn =
    new SqlConnection();
      conn.ConnectionString = "Integra
    ted Security=SSPI;Initial Catalog=pubs";
      conn.Open();                                                      
      // 连接池B创建了,因为ConnectionString与A不匹配          

      SqlConnection conn = new SqlConn
    ection();
      conn.ConnectionStrin
    g = "Integrated Security=SSP
    I;Initial Catalog=northwind";
      conn.Open();                                                      
      // 使用A的连接池,因为ConnectionString与A匹配            

      连接池一旦创建,直到
    统开销。
    活动进程终止时才会被毁坏。非

    活动或空池的维护只需要最少的系


      连接奶砑?/b>

      连接池是为每个唯一的连接字符串创
    添加到该池中,以满足最小池大小的要求

    建的。当创建一个池后,将创建多个连接对象并将其
    。连接将根据需要添加到池中,直至达到最大池大小


      当请求 SqlConnection
    为可用连接,该连接当前必
    联,并且具有与服务器的有
    对象时,如果存在可用的连接
    须未被使用,具有匹配的事务上
    效链接。
    ,则将从池中获取该对象。若要成
    下文或者不与任何事务上下文相关


      如果已达到最大池大小
    ,连接池管理程序通过重新
    Dispose 时,连接被释放回
    且不存在可用的连接,则该请求
    分配连接来满足这些请求。对 C
    池中。
    将会排队。当连接被释放回池中时
    onnection 调用 Close 或


      警告  建议使用完 Connection 后
    用 Connection 对象的 Close 或 Dispos
    返回到池中。例如,如果连接已超出范围
    然有效时,该连接才会返回到连接池中。
    始终将其关闭,以便连接可以返回到池中。这可以使
    e 方法来实现。不是显式关闭的连接可能不会添加或
    但没有显式关闭,则仅当达到最大池大小而该连接仍

      注意  不要在类的 Fi
    调用 Close 或 Dispose。
    非托管资源,则不要在类定
    nalize 方法中对 Connection、
    在终结器中,仅释放类直接拥有
    义中包含 Finalize 方法。有关
    DataReader 或任何其他托管对象
    的非托管资源。如果类不拥有任何
    更多信息,请参见厥毡喑獭?br>

      连接的移除

      如果连接生存期已过期,或者连接池
    程序将从池中移除该连接。请注意,只有
    。如果发现某连接不再连接到服务器,则
    池,查找已释放到池中并标记为无效的对
    管理程序检测到与服务器的连接已断开,连接池管理
    在尝试与服务器进行通信后,才可以检测到这种情况
    会将其标记为无效。连接池管理程序会定期扫描连接
    象。找到后,这些连接将被永久移除。

      如果存在与已消失的服
    其标记为无效,仍有可能将
    将该连接释放回池中,仍必
    务器的连接,那么即使连接池管
    此连接从池中取出。当发生这种
    须将其关闭。
    理程序未检测到已断开的连接并将
    情鍪保梢斐!5牵?br>

      字符串关键字:

      Connection Lifetime
    如果时间间隔超过由 Conne
    聚集配置中可以使用它来强
    0 当连接返回到池中时,将对它
    ction Lifetime 指定的值(以
    制在运行服务器和刚联机的服务
    的创建时间和当前时间进行比较,
    秒为单位),则会毁坏该连接。在
    器之间达到负载平衡。
      如果值为零 (0),则将使池连接具有最大的超时期限。                          

      Connection Reset 'true' 确定在从
    Microsoft SQL Server 版本 7.0,如果
    往返过程,但必须注意的是连接状态(如
    池中移除数据库连接时是否将其重置。对于
    设置为 false,将避免在获取连接时经历一个额外的
    数据库上下文)不会被重置。
      Enlist 'true' 当为 t
    前事务上下文中登记连接。
    rue 时,如果存在事务上下文,

    池管理程序将自动在创建线程的当

      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 myconnectionpo
    oling = new connectionpooling();
      myconnectionpooling.Run();                          
      }                                                                            

      public void Run()                                            
      {                                                                            
      try                                                                        
      {                                                                            
      String connString;                                          


      // Specification in
    the connection string:
      // Please note: Pool
    disable it.
    ing is implicit, you automat

    ically get it unless you

      //       Therefore, "true
    (pooling=true).
    " is the default for the pooling keyword

      // Connection Reset:  False                        
      // Connection Lifetime: 5                            
      // Enlist:       true                                    
      // Min Pool Size:    1                                  
      // Max Pool Size:    50                                
      connString = "server=(local)\Ne
    yes;database=northwind;" +
    tSDK;Trusted_Connection=

      "connection reset=false;" +                        
      "connection lifetime=5;" +                          
      "min pool size=1;" +                                      
      "max pool size=50";                                        

      SqlConnection myConn
    ection1 = new SqlConnection(
    connString);
      SqlConnection myConn
    ection2 = new SqlConnection(
    connString);
      SqlConnection myConn
    ection3 = new SqlConnection(
    connString);

      // Open two connections.                              
      Console.WriteLine ("打开两个连接。");                  
      myConnection1.Open();                                    
      myConnection2.Open();                                    

      // Now there are two
    string.
    connections in the pool tha

    t matches the connection


      // Return the both c
    onnections 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 o
    f the pool.
      Console.WriteLine ("从池中打开第二个连接。");          
      myConnection2.Open();                                    

      // Open a third connection.                        
      Console.WriteLine ("打开第三个连接。");                
      myConnection3.Open();                                    


      // Return the all co
    nnections to the pool.
      Console.WriteLine ("将所有三个连接都返回到池中。");    
      myConnection1.Close();                                  
      myConnection2.Close();                                  
      myConnection3.Close();                                  
      }                                                                            
      catch (Exception e)                                        
      {                                                                            
      // Display the error.                                    
      Console.WriteLine(e.ToString());              
      }                                                                            
      }                                                                            
      }                                                                            

      }                                                                            


    上一页 下一页




    map