连接池使应用程序能够使用连接池中的连接,而不需要为每次使用重新建立连接。 创建并放置在池中的连接后,应用程序可以重复使用该连接,而无需执行完整的连接过程。
使用共用连接可能会导致显著性能提升,因为应用程序可以节省连接所涉及的开销。 对于通过网络连接的中间层应用程序或重复连接和断开连接的应用程序(例如 Internet 应用程序),这尤其重要。
除了性能提升之外,连接池体系结构还允许单个进程中多个组件使用环境及其关联的连接。 这意味着同一进程中的独立组件可以相互交互,而无需相互了解。 连接池中的连接可由多个组件重复使用。
注释
连接池可以由展示 ODBC 2.x 行为的 ODBC 应用程序使用,只要该应用程序可以调用 SQLSetEnvAttr。 使用连接池时,应用程序不得执行更改数据库或数据库的上下文的 SQL 语句,例如更改<,从而更改>数据源使用的目录。
ODBC 驱动程序必须完全线程安全,并且连接不能具有线程关联来支持连接池。 这意味着驱动程序可以随时处理任何线程上的调用,并且能够在一个线程上连接,在另一个线程上使用连接,并在第三个线程上断开连接。
连接池由驱动程序管理器维护。 当应用程序调用 SQLConnect 或SQLDriverConnect 时,将从池中提取连接,当应用程序调用 SQLDisconnect 时会返回到池。 池的大小根据请求的资源分配动态增长。 它根据非活动超时而收缩:如果连接在一段时间内处于非活动状态(它尚未在连接中使用),则会从池中删除它。 池的大小仅受内存约束和服务器限制。
驱动程序管理器根据 SQLConnect 或SQLDriverConnect 中传递的参数以及根据在分配连接后设置的连接属性来确定池中的特定连接是否应使用。
当驱动管理器正在进行连接池化时,它需要能够在提供连接之前确定连接是否仍然有效。 否则,每当发生暂时性网络故障时,驱动程序管理器将继续向应用程序发出死连接。 ODBC 3*.x* 中定义了新的连接属性:SQL_ATTR_CONNECTION_DEAD。 这是返回SQL_CD_TRUE或SQL_CD_FALSE的只读连接属性。 值SQL_CD_TRUE表示连接已丢失,而值SQL_CD_FALSE表示连接仍处于活动状态。 (符合早期版本的 ODBC 的驱动程序也可以支持此属性。
驱动程序必须有效地实现此选项,否则它将损害连接池性能。 具体而言,获取此连接属性的调用不应导致服务器的往返。 相反,驱动程序应只返回连接的最后一个已知状态。 如果最后一次访问服务器失败,则连接将失效,如果上次访问成功,则连接不会死。
注解
如果连接已丢失(通过 SQL_ATTR_CONNECTION_DEAD 报告),ODBC 驱动程序管理器将通过调用驱动程序中的 SQLDisconnect 来销毁该连接。 新的连接请求可能无法在池中找到可用连接。 最终,驱动程序管理器可能会建立一个新的连接,假设池为空。
若要使用连接池,应用程序将执行以下步骤:
通过调用 SQLSetEnvAttr 将SQL_ATTR_CONNECTION_POOLING环境属性设置为SQL_CP_ONE_PER_DRIVER或SQL_CP_ONE_PER_HENV来启用连接池。 在应用程序分配共享环境以启用连接池之前,必须进行此调用。 调用 SQLSetEnvAttr 时,应将环境句柄设置为 null,这会使 SQL_ATTR_CONNECTION_POOLING 成为一个进程级属性。 如果属性设置为SQL_CP_ONE_PER_DRIVER,则每个驱动程序都支持单个连接池。 如果应用程序适用于许多驱动程序和少量环境,则可能更高效,因为可能需要较少的比较。 如果设置为SQL_CP_ONE_PER_HENV,则每个环境都支持单个连接池。 如果应用程序适用于许多环境和少量驱动程序,则可能更高效,因为可能需要较少的比较。 通过将SQL_ATTR_CONNECTION_POOLING设置为SQL_CP_OFF来禁用连接池。
通过将 HandleType 参数设置为SQL_HANDLE_ENV调用 SQLAllocHandle 来分配环境。 此调用分配的环境将是隐式共享环境,因为连接池已启用。 在调用此环境中的 SQLAllocHandle 并使用 HandleType 为 SQL_HANDLE_DBC 之前,不会确定要使用的环境。
通过调用 SQLAllocHandle,并将 InputHandle 设置为 SQL_HANDLE_DBC,以及将 InputHandle 设置为为连接池分配的环境句柄来分配连接。 驱动程序管理器尝试查找与应用程序设置的环境属性匹配的现有环境。 如果不存在此类环境,则会创建一个环境,引用计数(由驱动程序管理器维护)为 1。 如果找到匹配的共享环境,则会将环境返回到应用程序,并递增其引用计数。 (在调用 SQLConnect 或SQLDriverConnect 之前,驱动程序管理器不会确定要使用的实际连接。
调用 SQLConnect 或 SQLDriverConnect 以建立连接。 驱动程序管理器使用对 SQLConnect 的调用中的连接选项(或调用 SQLDriverConnect 中的连接关键字)以及连接分配后设置的连接属性,以确定应使用池中的哪个连接。
注释
请求的连接如何与共用连接匹配,取决于SQL_ATTR_CP_MATCH环境属性。 有关详细信息,请参阅 SQLSetEnvAttr。
使用连接池的 ODBC 应用程序应在应用程序初始化期间调用 CoInitializeEx ,并在应用程序关闭时 调用 CoUninitialize 。
在完成连接后调用 SQLDisconnect。 连接将返回到连接池,并可供重复使用。
有关详细讨论,请参阅 Microsoft 数据访问组件中的池化。
连接池的注意事项
使用 SQL 命令执行以下任何作(而不是通过 ODBC API)可能会影响连接的状态,并在连接池处于活动状态时导致意外问题:
打开连接并更改默认数据库。
使用 SET 语句更改任何可配置选项(包括 SET ROWCOUNT、ANSI_NULL、IMPLICIT_TRANSACTIONS、SHOWPLAN、STATISTICS、TEXTSIZE 和 DATEFORMAT)。
创建临时表和存储过程。
如果在 ODBC API 之外执行上述任何作,则使用连接的下一个人员将自动继承以前的设置、表或过程。
注释
不要期望在连接状态中看到某些设置。 应始终在应用程序中设置连接状态,并确保应用程序删除任何未使用的连接池设置。
识别驱动程序的连接池
从 Windows 8 开始,ODBC 驱动程序可以更有效地使用池中的连接。 有关详细信息,请参阅识别驱动程序的连接池。