连接池(转)

数据库连接是一种关键的有限的昂贵的资源,数据库连接池正是针对这个问题提出来的。数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重 复使用一个现有的数据库连接,而再不是重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这 项技术能明显提高对数据库操作的性能。数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数来设定 的。无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应 用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。数据库连接池的最小连接数和最大连接数的设置要考虑到下列几个因素:

  1. 最小连接数是连接池一直保持的数据库连接,所以如果应用程序对数据库连接的使用量不大,将会有大量的数据库连接资源被浪费。
  2. 最大连接数是连接池能申请的最大连接数,如果数据库连接请求超过此数,后面的数据库连接请求将被加入到等待队列中,这会影响之后的数据库操作。
  3. 如果最小连接数与最大连接数相差太大,那么最先的连接请求将会获利,之后超过最小连接数量的连接请求等价于建立一个新的数据库连接。不过,这些大于最小连接数的数据库连接在使用完不会马上被释放,它将被放到连接池中等待重复使用或是空闲超时后被释放。

  连接池是为每一个唯一的连接字符串所创建的。它采用一种算法,根据与连接字符串的准确匹配对连接池中的连接进行关联。这个匹配包含大小写、名称 /值对的顺序,甚至是名称/值对之间的空格。动态生成的连接字符串必须相同、以便使用连接池。如果使用了委托,每个委托用户都将有一个连接池。如果使用了 事务,将为每个事务环境创建一个连接池。连接对象被创建并添加到连接池中,以满足指定的最小连接池大小。当应用程序请求一个连接并且连接池已经达到最大数 量时,这个连接请求会排队。这个请求可以通过重新分配一个释放回连接池的连接(当它们关闭或撤销时)来得到满足。连接池管理器从连接池中移除过期的连接以 及服务器已经完成了服务的连接。当一个 Connection 对象不再需要时,应该尽快关闭,是它可以被添加或返回到连接池。未显示关闭的 Connection 对象可能无法添加或返回到连接池。

  参与事务的连接是从连接池提取的,并且根据与请求线程的事务环境以及连接字符串的准确匹配进行分配。每个连接池为没有事务环境的连接划分一个子 区,并且为与特定事务环境相关联的连接划分0~n个分区。当一个与一个特定事务环境相关联的线程请求一个连接时,就会从这个事务中所登记的适当连接池中自 动返回一个连接。当一个连接连接被关闭时,它根据事务环境被返回到连接池中的适当分区。这就允许一个连接即使在一个分布式事务尚未提交时仍然能够被关闭, 而不会产生错误,这个事务可以在以后被提交或关闭。

  我们可以使用连接字符串、编辑注册表或在程序中使用相应 API 控制 SQL Server、OLE DB、Oracle、ODBC 数据提供程序的连接池。

(1)SQL Server

  SQL Server 的连接字符串形如:

  Data Source=(local);Integrated Security=SSPI;Initial Catalog=MyTest;Connection Timeout=15;Connection Lifetime=0;Min Pool Size=0;Max Pool Size=100;Pooling=true;

  相应的属性如下:

  • Connection Lifetime:表示一个连接在创建之后多少秒被销毁,默认为0,表示具有最长的存活时间。
  • Connection Reset:指定了当一个连接从连接池中移除时是否重置这个连接,默认值为 true。
  • Enlist:指定了当事务环境存在时是否把这个连接在创建线程的当前事务环境中自动登记,默认值为 true。
  • Load Balance Timeout:一个连接从连接池中移除之前可以保持多少秒。
  • Min Pool Size:连接池中维护的最少连接数,默认0。
  • Max Pool Size:连接池中允许的最大连接数,默认100。
  • Pooling:指定这个连接是从连接池中获取还是根据需要创建并添加到连接池,默认值为 true。 

(2)Oracle

  连接池的相应的属性如下:

  • Connection Lifetime:表示一个连接在创建之后多少秒被销毁,默认为0,表示具有最长的存活时间。
  • Enlist:指定了当事务环境存在时是否把这个连接在创建线程的当前事务环境中自动登记,默认值为 true。
  • Min Pool Size:连接池中维护的最少连接数,默认0。
  • Max Pool Size:连接池中允许的最大连接数,默认100。
  • Pooling:指定这个连接是从连接池中获取还是根据需要创建并添加到连接池,默认值为 true。 

(3)OLE DB

  OLE DB 资源连接池配置是使用注册表控制的,不存在对这些项进行设置的界面,必须直接修改注册表。  

  相关的注册表项由<Provider's CLSID>标识的。有些 Microsoft OLE DB 提供程序的 CLSID 值是:

  (a)SQLOLEDB(SQL Server)

    HKEY_CLASSES_ROOT\CLSID\{0C7FF16C-38E3-11d0-97AB-00C04FC2AD98}

  

  (b)Microsoft.Jet.OLEDB.4.0(Jet)

    HKEY_CLASSES_ROOT\CLSID\{dee35070-506b-11cf-b1aa-00aa00b8de95}

  (c)MSDAORA(Oracle)

    HKEY_CLASSES_ROOT\CLSID\{e8cc4cbe-fdff-11d0-b865-00a0c9081c1d}

  (d)MSDASQL(OLE DB Provider for ODBC)

    HKEY_CLASSES_ROOT\CLSID\{c8b522cb-5cf3-11ce-ade5-00aa0044773d}

  会话池超时时间是一个未使用的会话在连接池中超时并关闭之前所维持的秒数,配置选项是:HKEY_CLASSES_ROOT\CLSID \<Provider's CLSID>\SPTimeout,这是个 DWORD 值,若在注册表中未指定,它的默认值是60。

  下面的注册项对所有提供程序通用:

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\DataAccess\Session Pooling\RetryWait

  当连接失败时,服务组件试图再次连接服务器之前所等待的时间,这是个 DWORD 值,若在注册表中未指定,它的默认值是64。

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\DataAccess\Session Pooling\ExpBackOff

  决定了当连接失败时,服务组件的重新连接尝试之前将等待的时间,这是个 DWORD 值,若在注册表中未指定,它的默认值是2。

    HKEY_CLASSES_ROOT\CLSID\{2206CDB0-19C1-11D1-89E0-00C04FD7A829}

  这个 DWORD 值,指定了一个连接池以秒为带我的最长生命周期,默认值是600。

  为一个提供程序所启用的默认 OLE DB 服务是由注册表 HKEY_CLASSES_ROOT\CLSID\<Provider's CLSID>\OLE_DBSERVICES 指定的,我们也可以在连接字符串中为 OLE DB Services 属性指定一个值,以重写默认的 OLE DB 提供程序服务,以下是相应的 DWORD 值:

  OLE_DBSERVICES值   对应的 OLE DB Services 属性值     描述        

  • 0xffffffff         -1                 所有服务(默认)
  • 0xfffffffe         -2                 除了连接池之外的所有服务
  • 0xfffffffc         -4                 除了连接池和自动事务登记之外的所有服务
  • 0xfffffffb         -5                 除了客户游标引擎之外的所有服务
  • 0xfffffff8         -8                 除了连接池、自动事务登记和客户游标引擎之外的所有服务
  • 0x00000003        3                 只包含连接池和自动事务登记、会话层的聚合
  • 0x00000000        0                 无服务
  • missing value                         无聚合,所有服务都被禁用

(4)ODBC

  下面两个注册表设置用于控制 ODBC 连接池:

  Wait Retry

    当服务器不响应时连接池的阻塞时间(秒)。这个设置影响所有使用 ODBC 驱动程序的应用程序。这个注册表指定了一个 REG_SZ 值:

    HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\<Driver_Name>\CPTimeout

  CPTimeout

    未使用的连接在连接池中保留的时间(秒)。这个设置影响所有使用 ODBC 驱动程序的应用程序。这个注册表指定了一个 REG_SZ 值:

    HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\ODBC Connection Pooling

posted @ 2014-02-18 18:10  邹邹  Views(176)  Comments(0)    收藏  举报