Oracle Database Resident Connection Pooling (DRCP) 白皮书阅读笔记

news2025/4/23 9:44:39

本文为“Extreme Oracle Database Connection Scalability with Database Resident Connection Pooling (DRCP)”的中文翻译加阅读笔记。觉得是重点的就用粗体表示了。

白皮书版本为March 2025, Version 3.3,副标题为:Optimizing Oracle Database resource usage for applications and mid-tier services。

简介

数据库驻留连接池 (DRCP) 是 Oracle 数据库的一项功能,专为需要多个连接并优化数据库资源利用率的环境而开发。DRCP 通常适用于微服务和 Web 应用程序场景,在这些场景中,应用程序获取数据库连接,在相对较短的时间内进行操作,然后释放连接。DRCP 为数据库提供了一个“专用”服务器进程池(称为池化服务器),可由运行在同一台或多台应用层主机上的多个应用程序共享。这些池化服务器处理与客户端应用程序的数据库连接/会话。连接代理进程在数据库实例级别控制池化服务器。由于 DRCP 是在应用程序运行时选择的可配置功能,因此客户端应用程序可以同时使用传统连接架构和基于 DRCP 的连接架构。

在 Oracle 数据库传统的专用连接模型中,每个进程在打开和关闭连接时都会创建和销毁数据库服务器。具有空闲专用连接的应用程序将占用数据库资源,例如服务器进程、内存存储等。

DRCP 实现会在数据库主机上创建一个服务器进程池,供多个应用程序共享。由于客户端连接在数量减少的数据库服务器进程上进行多路复用,DRCP 池显著降低了服务器上的内存消耗。这消除了数据库服务器创建和销毁的开销,并提高了涉及 Oracle 数据库的应用程序部署的可扩展性。如本文档后面所述,DRCP 中具有空闲连接的应用程序不会消耗数据库资源。

DRCP 提升了数据库和应用层的可扩展性,因为与数据库的连接以最低的成本保持。数据库内存仅由池服务器使用。

从 Oracle Database 11g 版本开始,所有版本均支持 DRCP,并且可在本地和 Oracle 云中使用。任何运行 JDBC、ODP.NET 和 Oracle 调用接口 (OCI) 库的应用程序都可以使用 DRCP 连接到 Oracle Database。使用 Oracle Database Python、Node.js、PHP、Ruby 和 Go 驱动程序的应用程序也支持 DRCP。

本文档涵盖了 DRCP 的架构、配置设置、命令、优势、系统视图和示例,帮助您入门和运行 DRCP。

有关 DRCP 的更详细概述,请参阅最新的 Oracle Database 管理员指南:DRCP 部分。

DRCP架构概述

DRCP 使应用程序能够扩展到数万个并发数据库连接。DRCP 架构在实现这种可扩展性方面发挥着至关重要的作用。

DRCP 使用池化服务器进程,这些进程本质上是专用服务器进程和数据库会话的组合。此模型避免了为每个仅短暂需要服务器的客户端连接分配专用服务器的开销。

从 DRCP 请求连接的客户端应用程序(在本节中称为客户端)与称为连接代理的 Oracle 后台进程进行通信。连接代理会在来自客户端的入站连接请求之间多路复用池化服务器进程。

最初,连接代理使用一组预留的 DRCP 进程(称为身份验证服务器)来验证来自客户端的连接请求。通常,当前池中的服务器数量中约有 5% 会保留用于身份验证。

在这里插入图片描述
图 1:客户端和数据库主机之间的 DRCP 架构

每当客户端进程获取应用程序连接时,连接代理都会从空闲池中选择一个池化服务器进程并将其传递给客户端。客户端将直接连接到该服务器进程(称为“活动的”池化服务器),直到数据库活动完成。

服务器完成数据库活动后,客户端应用程序必须将活动的池化服务器进程释放回 DRCP 池。然后,这将重新建立与连接代理的链接。与连接代理的链接将保持打开状态,直到客户端进程停止运行或客户端获取应用程序连接为止。

此外,对于 DRCP,会话内存存储在数据库的程序全局区域 (PGA) 中,该区域在物理上对进程(此处指数据库连接)是私有的。这种实现使客户端能够在需要任何数据库活动时快速重新建立连接。

DRCP Quickstart

可以通过运行 PL/SQL DRCP 包 DBMS_CONNECTION_POOL 中的相应过程来启动、配置和停止池。只有拥有 SYSDBA 权限的用户(即 SYS 用户)或由 SYS 用户授予 PL/SQL DRCP 包 EXECUTE 访问权限的用户才能运行该池。

在 Oracle 云自治数据库中,DRCP 默认启动。否则,请以具有所需权限的用户身份登录 Oracle 数据库,并运行 dbms_connection_pool.start_pool() PL/SQL 过程。

该过程成功运行后,任何客户端应用程序都可以使用 Easy Connect 字符串语法,在网络连接描述符字符串中使用“:pooled”字符串或设置 (SERVER=POOLED) 通过 DRCP 访问 Oracle 数据库。未更改连接字符串的应用程序将继续使用传统的专用服务器进程。

有关配置 DRCP 以及使用 DRCP 的其他应用程序的更多详细信息和示例,请参阅本技术简介的后续章节。

How DRCP works

使用 DRCP 时,数据库监听器首先将来自客户端的新连接请求交给 DRCP 连接代理 (CB)。这些连接请求必须先进行身份验证,然后才能在连接上运行任何数据库事务。

代理使用池中预留的身份验证服务器之一执行身份验证。登录触发器在每次身份验证和每个用户会话(创建用户会话时)触发一次。注销触发器在每次注销和会话释放时触发。身份验证完成后,代理会保持客户端连接持久,直到客户端关闭连接。此外,池服务器请求和释放可以在这个持久且经过身份验证的连接上进行。这些活动由代理协调。

收到应用程序连接请求时,连接代理会从数据库服务器进程的空闲池中为客户端分配一个服务器,并将经过身份验证的客户端连接移交给该服务器。客户端的所有数据库交互都由这个分配的服务器进程(称为“繁忙”服务器)进行。当客户端通过 API 调用显式关闭会话或客户端应用程序结束时,繁忙服务器将连同会话一起释放回空闲服务器池。然后,如果客户端应用程序仍在运行,客户端将恢复与连接代理的连接。连接代理将保留此连接,直到收到后续客户端连接请求、客户端应用程序终止连接或客户端应用程序结束为止。

在这里插入图片描述
图 2:DRCP 操作阶段

池大小以及连接代理和身份验证服务器的数量均可配置。启用 DRCP 时,每个数据库实例始终至少有一个连接代理

Database Concept中的这张图也可以参考:
在这里插入图片描述

When to use DRCP

DRCP 通常推荐用于以下情况:

  • 包含无法使用应用程序连接池的应用服务器(例如 PHP)的架构
  • 包含多个 Web 服务器、微服务或需要数据库访问和应用程序连接池的应用服务器的大规模 Web 部署
  • 需要以最低的数据库主机内存使用率支持高客户端连接流量的 Web 架构
  • 连接保持时间较短的应用程序
  • 主要对所有连接使用相同数据库凭据的应用程序
  • 具有相同连接或会话设置(例如日期格式和 PL/SQL 包状态)的应用程序

这些用例通常涉及在多台主机上运行的多进程应用程序,这些应用程序与数据库保持大量持久连接,但不希望在连接不活跃时消耗数据库服务器内存。借助 DRCP,数据库可以扩展到数万个并发连接。

这个例子很直观)例如,一个池大小为 200 的中间层连接池将拥有 200 个与数据库的连接。反过来,数据库将有 200 个与这些连接关联的服务器进程。假设有 30 个类似的中间层应用程序。那么数据库将有 200 * 30 = 6000 个相应的服务器进程以专用服务器模式运行。假设在任何给定时间,这些连接(以及服务器进程)中只有 5% 处于使用状态。在这种情况下,只有 300 个服务器进程处于活动状态,而数据库端在任何给定时间运行的 5,700 个空闲服务器进程则被浪费或用作未使用的资源。

DRCP 可以通过将客户端连接复用到更少的池化服务器上​​来解决此资源浪费问题。例如,6000 个客户端连接可能只需要 100 个池化服务器进程(取决于连接保持的时间),从而实现最佳的数据库资源利用率和更高的可扩展性。

当通过 TCP/IP 连接并使用基于用户 ID/密码的数据库身份验证时,可以使用 DRCP。使用 Oracle 的 Bequeath 或 TCPS 连接时,则无法使用 DRCP。注意这个限制

建议将 DRCP 与应用程序连接池结合使用,以实现最高效率和最佳的数据库资源消耗。为了获得最佳 DRCP 性能,应用程序应明确指定连接类别,如本文档后面所示。

此外,使用 DRCP 时,请考虑这些限制。

将 DRCP 与其他数据库服务器进程模型进行比较

除了 DRCP 的池化服务器之外,Oracle 应用程序还可以使用另外两种数据库服务器进程模型来访问数据:专用服务器和共享服务器。Oracle 数据库默认提供专用服务器

下表列出了专用服务器、共享服务器和池化服务器之间的区别。

专用服务器共享服务器池化服务器
建立连接后,会创建与专用服务器进程的网络连接以及相关会话。连接创建后,会建立与调度程序进程的网络连接。会话会在 SGA 中创建。连接创建后,会建立与代理的网络连接并进行身份验证。
专用服务器处理连接上的活动连接上的每个操作(本质上是一个SQLNet往返,可能涉及一个或多个SQL或PL/SQL语句的执行、事务提交等。)都会经过调度程序,调度程序会将工作交给共享服务器。当应用程序请求会话时,代理服务器会被唤醒,并将网络连接交给一个已建立会话的池化服务器。然后,池化服务器会像专用服务器一样直接处理后续的数据库请求或活动。
正在执行但客户端连接空闲的程序将保持与服务器进程的连接并占用会话资源。正在执行但客户端连接空闲的程序将占用会话资源,但不保持与服务器进程的连接。正在执行但客户端连接空闲且已释放数据库会话的程序将保持与连接代理的连接。
关闭客户端连接会导致会话被释放,服务器进程终止。关闭客户端连接会导致会话被释放,客户端将与调度程序断开连接。关闭客户端连接会导致包含该会话的池化服务器被释放到池中。与连接代理的网络连接将保留。
内存使用量与服务器进程和会话的数量成正比。每个连接对应一个服务器和一个会话。内存使用量与共享服务器和会话的总和成正比。每个客户端连接对应一个会话。内存使用量与池化服务器进程及其会话的数量成正比。每个池化服务器对应一个会话。

表 1 – 专用服务器、共享服务器和池服务器之间的区别

注意:对于 DRCP,连接空闲时将被释放回应用程序连接池。

专用服务器、共享服务器和池化服务器之间的主机内存使用情况示例

专用服务器共享服务器池化服务器
数据库服务器内存5000 x 8 MB100 x 8 MB100 x 8 MB
会话内存5000 x 400 KB5000 x 400 KB(注意:对于共享服务器,会话内存是从 SGA 分配的)100 x 400 KB
DRCP 连接代理开销0(不适用)0(不适用)5000 x 35 KB
总内存42 GB2.8 GB1 GB

表 2 – 专用服务器、共享服务器和池化服务器的数据库内存使用情况示例

可以看出,在三个选项中,DRCP 池服务器提供了最佳的数据库主机内存使用率。

配置数据库驻留连接池

本节介绍如何在服务器端和客户端配置和启用 DRCP:

  • 在服务器端启用和配置 DRCP
  • 部署 DRCP 的应用程序

注意:Oracle 云自治数据库中已默认启动 DRCP。

您可以使用 DRCP 配置选项和 DRCP 数据库初始化参数来配置 DRCP 的设置,本节稍后将详细介绍。

在服务器端启用和配置 DRCP

从 Oracle Database 21c 开始,数据库管理员 (DBA) 在配置 DRCP 时首先要选择是每个 PDB 的 DRCP 还是 CDB 的 DRCP。请注意,CDB DRCP 是默认的 DRCP 配置。

只有拥有 SYSDBA 权限的 DBA 或拥有 DBMS_CONNECTION_POOL 包 EXECUTE 权限(由 SYS 用户授予)的 PDB 管理员才能启动和停止池。在本节中,我们将使用 SQL*Plus 在数据库中配置 DRCP。

对于 CDB DRCP,拥有 SYSDBA 权限的数据库用户(通常是 SYS 用户)可以使用 DBMS_CONNECTION_POOL 包的以下命令来管理 DRCP。

  1. 启动连接池:start_pool 过程启动 DRCP。当 DRCP 启动时,如果未指定连接池名称,Oracle 数据库会将创建的默认连接池命名为 SYS_DEFAULT_CONNECTION_POOL。
connect / as sysdba
execute dbms_connection_pool.start_pool()

从 Oracle Database 23ai 开始,如果您使用多池 DRCP,start_pool 过程还允许您指定池名称。

connect / as sysdba
execute dbms_connection_pool.start_pool('my_pool')

一旦启动,池会在实例重新启动时自动重新启动,除非使用 stop_pool() 过程明确停止。

  1. 停止连接池:stop_pool 过程停止 DRCP。
    如果默认 DRCP 池 (SYS_DEFAULT_CONNECTION_POOL) 正在运行,则可以通过以下命令将其停止:
execute dbms_connection_pool.stop_pool()

从 Oracle Database 23ai 中,您可以按如下方式停止多池 DRCP 中的特定命名池:

execute dbms_connection_pool.stop_pool('my_pool')

Oracle Database 23ai 还在 stop_pool() 中提供了一个新的可选 DRAINTIME 参数。此参数允许在指定的连接耗尽时间(以秒为单位)后关闭活动的 DRCP 池,或立即关闭(值为 0),而无需等待连接空闲。此功能使 DBA 能够更好地控制 DRCP 的使用和配置。此参数可与默认 DRCP 池以及多池 DRCP 配置中的命名池一起使用。例如:

-- 此调用将立即中止默认池中的所有池服务器并停止默认池。
execute dbms_connection_pool.stop_pool(pool_name => '', draintime => 0)
-- 此调用将等待 30 秒,然后中止池服务器并停止默认池。
execute dbms_connection_pool.stop_pool(pool_name => '', draintime => 30)
-- 此调用将立即中止名为“my_pool”的池中的所有池服务器并停止该池。
execute dbms_connection_pool.stop_pool(pool_name => 'my_pool', draintime => 0)
-- 此调用将等待 30 秒,然后中止名为“my_pool”的池中的所有池服务器并停止该池。
execute dbms_connection_pool.stop_pool(pool_name => 'my_pool', draintime => 30)

此调用将立即中止默认池中的所有池服务器并停止默认池。
3. 配置连接池:configure_pool 过程会使用附加选项配置默认或命名的 DRCP 池。例如:

execute dbms_connection_pool.configure_pool(
minsize => 4, 
maxsize => 40, 
incrsize => 2, 
session_cached_cursors => 20, 
inactivity_timeout => 300, 
max_think_time => 600, 
max_use_session => 500000,
max_lifetime_session => 86400)

当必须修改所有连接池参数时,使用此过程。
要配置名为 my_pool 的池,请运行:

execute dbms_connection_pool.configure_pool(
pool_name => 'my_pool',
minsize => 4, 
maxsize => 40, 
incrsize => 2, 
session_cached_cursors => 20, 
inactivity_timeout => 300, 
max_think_time => 600, 
max_use_session => 500000,
max_lifetime_session => 86400)
  1. 改变参数:或者,方法 dbms_connection_pool.alter_param() 可用于设置 DRCP 池中的单个参数,并且不会影响其他池参数。
    要更改默认池(SYS_DEFAULT_CONNECTION_POOL)中的“MAX_THINK_TIME”参数值,请运行:
execute dbms_connection_pool.alter_param( 
param_name => 'MAX_THINK_TIME', 
param_value => '1200')

要更改命名池(例如 my_pool)中的“MAX_THINK_TIME”参数值,请运行:

execute dbms_connection_pool.alter_param( 
pool_name => 'my_pool',
param_name => 'MAX_THINK_TIME', 
param_value => '1200')

alter_param 和 configure_pool 选项之间的区别在于 alter_param 仅影响单个参数,而 configure_pool 要求在调用时指定所有参数值。

  1. 恢复默认值:restore_defaults() 过程重置任何 DRCP 池的默认配置值。
-- 要恢复默认池(SYS_DEFAULT_CONNECTION_POOL)的默认值,请运行
exec dbms_connection_pool.restore_defaults()
-- 要恢复指定池(例如 my_pool)的默认配置,请运行
exec dbms_connection_pool.restore_defaults(‘my_pool`)

如果 DRCP 处于 PDB 级别(每个 PDB DRCP),则 PDB 管理员(启用权限)将必须对相应的 PDB 执行上述命令。

DRCP 配置设置
下表显示了 configure_pool 和 alter_param 过程可以使用的 DRCP 配置选项列表:

DRCP 选项描述
POOL_NAME要配置的池的名称。在 Oracle Database 21c 之前,唯一支持的名称是默认值 SYS_DEFAULT_CONNECTION_POOL。从 Oracle Database 23ai 开始,其他名称可用于新的多池功能。
MINSIZE设置池中池化服务器的最小数量。当在 CDB 级别配置 DRCP 时,默认值为 4;当启用每个 PDB 的 DRCP 时,默认值为 0。
MAXSIZE设置池中允许的最大池化服务器数量。如果达到此限制并且所有池化服务器都处于繁忙状态,则连接请求将等到服务器空闲为止。默认值为 40。
INCRSIZE设置在服务器不可用于连接且池尚未达到其最大大小时池化服务器增加的增量数。默认值为 2。
SESSION_CACHED_CURSORS为所有池连接启用数据库参数 SESSION_CACHED_CURSORS。通常,此数字设置为常用语句的工作集的大小。缓​​存使用服务器上的游标资源。默认值为 20。init.ora 参数也可用于设置整个数据库实例的值。池选项允许基于 DRCP 的应用程序覆盖实例设置。
INACTIVITY_TIMEOUT池中空闲服务器的生存时间(以秒为单位)。超过此时间后,空闲服务器进程将被终止。当池未达到其最大容量时,此参数有助于缩小池。如果池大小已为最小值,则此参数将不适用。默认值为 300 秒。
MAX_THINK_TIME客户端连接到池中服务器后允许的最长不活动时间(以秒为单位)。如果应用程序代码或脚本在此时间内未发出数据库调用,则池化服务器可能会返回到池中以供重用,并且客户端连接将被终止。如果应用程序稍后尝试使用该连接,则会收到 ORA-3113 或 ORA-3135 错误。默认值为 120 秒。
MAX_TXN_THINK_TIME客户端使用池化服务器启动事务后,其最长不活动时间(以秒为单位)。如果客户端应用程序在从池中获取池化服务器后未在 max_txn_think_time 规定的时间内发出数据库调用,则池化服务器将被释放,客户端连接将被终止。此参数的默认值为 max_think_time 参数值。应用程序可以将此参数值设置为高于 max_think_time 值,以便为打开事务的连接提供更多时间。如果应用程序稍后尝试使用该连接,则会收到 ORA-3113 或 ORA-3135 错误。
MAX_USE_SESSION服务器在被标记为重新启动之前,可以被提取并释放到池中的最大次数。默认值为 500000。
MAX_LIFETIME_SESSION池化服务器在重新启动前的生存时间(以秒为单位)。默认值为 86400 秒。
NUM_CBROK为处理连接请求而创建的连接代理数量。此参数可使用 alter_param() 进行设置。默认值为 1。如果每个 PDB 都启用了 DRCP,则无法使用 alter_param() 来设置此参数。只有根 DBA 可以使用数据库初始化参数 CONNECTION_BROKERS 进行设置,如下图所示。PDB 管理员也无法修改此参数的值。对于 CDB 根级 DRCP,如果未使用 CONNECTION_BROKERS 设置此参数,则根 DBA 可以使用 alter_param() 过程进行设置。建议使用 CONNECTION_BROKERS 来设置此参数。
MAXCONN_CBROK设置每个连接代理可以处理的最大连接数。操作系统的每个进程文件描述符限制必须设置得足够高,以支持指定的连接数。此参数只能使用 alter_param() 设置。默认值为 40000。如果启用了每个 PDB DRCP,则不能使用 alter_param() 设置此参数。只有根 DBA 可以使用数据库初始化参数 CONNECTION_BROKERS 来设置它们,如下图所示。PDB 管理员也无法修改此参数的值。对于 CDB DRCP,如果未使用 CONNECTION_BROKERS 设置此参数,则根 DBA 可以使用 alter_param() 过程来设置它。建议使用 CONNECTION_BROKERS 来设置此参数。

表 3 – DRCP 配置选项

您还可以设置数据库初始化参数,以便在 DRCP 中进行额外的配置和优化:

DRCP 参数描述
ENABLE_PER_PDB_DRCP从 Oracle Database 21c 及更高版本开始可用。此参数指定 DRCP 是在 CDB 级别配置还是在每个 PDB 级别配置。默认值为 FALSE,表示在 CDB 级别配置 DRCP。当此参数设置为 TRUE 时,将为每个 PDB 创建一个隔离的连接池,并且不会在 CDB 级别创建任何连接池。
DRCP_DEDICATED_OPT从 Oracle Database 19.11 及更高版本开始可用。此参数配置 DRCP 专用优化的使用。在 Oracle Database 19c 中默认值为 YES,从 Oracle Database 21c 及更高版本开始默认值为 NO。将此参数设置为 YES 即可启用专用优化。当与 DRCP 代理的连接数小于 DRCP 池的最大大小时,专用优化使 DRCP 像专用服务器一样运行。即使连接处于非活动状态,专用优化也允许开放的池服务器数量增长到最大大小。根据 ENABLE_PER_PDB_DRCP 参数的值,CDB 根用户或 PDB 管理员用户可以修改此参数。
DRCP_CONNECTION_LIMIT从 Oracle Database 21c 及以上版本开始可用。此参数设置 PDB 的 DRCP 连接数限制。如果 PDB 设置了会话限制并随后重新启动,则默认值为 10 * 会话。否则,为 0(无限制 DRCP 连接)。
MAX_AUTH_SERVERS从 Oracle Database 19.10 及以上版本开始可用。此参数指定 DRCP 身份验证池中服务器进程的最大数量。此值必须大于或等于 MIN_AUTH_SERVERS 参数值。如果 MIN_AUTH_SERVERS 值为 0,则此值必须至少为 1。默认值为 25。根据 ENABLE_PER_PDB_DRCP 参数的值,此参数可由 CDB 根用户或 PDB 管理员用户修改。
MIN_AUTH_SERVERS从 Oracle Database 19.10 及以上版本开始可用。此参数指定 DRCP 身份验证池中的最小服务器进程数。此值必须小于或等于 MAX_AUTH_SERVERS 和 PROCESSES 参数的值。根据 ENABLE_PER_PDB_DRCP 参数的值,此参数可以由 CDB root 用户或 PDB admin 用户修改。
CONNECTION_BROKERS此参数指定连接代理类型、每种类型的连接代理数量以及每个代理的最大连接数。启用每个 PDB 的 DRCP 后,PDB 管理员用户无法在 PDB 中设置此参数。

表 4 – DRCP 数据库初始化参数

ALTER SYSTEM SQL 命令可用于修改除 ENABLE_PER_PDB_DRCP 之外的所有上述参数。此参数只能通过数据库配置文件设置。

为每个 PDB 的 DRCP 配置 Broker
由于 Broker 进程在所有 PDB 之间共享,因此 DBA_CPOOL_INFO 中的池参数 num_cbrok 和 maxconn_cbrok 将被忽略,并且 PDB 管理员无法使用 dbms_connection_pool.alter_param() 进行修改。这些参数可以使用数据库初始化参数 CONNECTION_BROKERS 进行设置,并且只能在 ROOT 容器中动态更改。默认情况下,将启动单个 Broker 进程,每个 Broker 的最大连接数限制为 40000 个,并在所有 PDB 之间共享。
根 DBA 可以使用 ALTER SYSTEM SQL 命令设置 CONNECTION_BROKERS 参数,如下所示:

ALTER SYSTEM SET CONNECTION_BROKERS = '((TYPE=POOLED)(BROKERS=2)(CONNECTIONS=40000))'

BROKERS 选项将设置连接代理的数量,而 CONNECTIONS 选项将设置每个代理的最大连接数。

将 DRCP 与 Oracle Real Application Clusters (RAC) 结合使用

当 DRCP 与 Oracle RAC (真正应用集群 - 一种数据库选项,其中单个数据库由多个节点上的多个实例托管)结合使用时,每个数据库实例都有自己的连接代理和服务器池。Oracle RAC 环境中的 DRCP 配置应用于每个数据库实例。因此,每个池的配置相同。例如,所有池都将以最小服务器进程数启动。单个 dbms_connection_pool 命令将同时更改每个实例的池。但是,表 6 中的数据库初始化参数(ENABLE_PER_PDB_DRCP 和 CONNECTION_BROKER 参数除外)可以在不同的实例中设置为不同的值。

将 DRCP 与 Oracle Cloud 自治数据库 (ADB) 结合使用
默认情况下,Oracle 云自治数据库 (ADB) 会启用 DRCP。请注意,客户端应用程序可以选择使用 DRCP,具体方法如下节所述。Oracle ADB 不允许用户启动或停止 DRCP。

在客户端应用程序中使用 DRCP

一旦在数据库上启用了 DRCP,应用程序就可以通过在 Easy Connect 字符串中指定“:POOLED”(如下例所示)或在网络连接描述符字符串中指定(SERVER=POOLED)来使用 DRCP 连接到数据库。

Easy Connect 字符串中带有“:pooled”的 DRCP

oraclehost.company.com:1521/booksdb.company.com:pooled

在网络连接描述符字符串中使用 SERVER=POOLED 启用 DRCP

BOOKSDB = (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oraclehost.company.com) (PORT=1521))(CONNECT_DATA = (SERVICE_NAME=booksdb.company.com)(SERVER=POOLED)))

通过 DRCP 连接到 Oracle 数据库的应用程序应该使用连接进行短暂的数据库活动,然后在数据库活动完成后立即关闭它们。

管理 DRCP 连接

DRCP 保证最初由一个数据库用户使用的池化服务器中的会话只能由具有相同用户标识符的连接重用。DRCP 还将池进一步划分为逻辑组或“连接类”。池化服务器也根据服务名称进行划分。建议应用程序提供连接类,以便在通过 DRCP 连接数据库时获得最佳性能。

DRCP 还允许应用程序设置会话纯度属性,以控制池化会话的可重用性。

连接类和会话纯度设置可帮助多个应用程序、Web 应用和微服务充分利用 DRCP 的潜力,并为最终用户提供最佳性能。

什么是连接类别?

连接类定义了应用程序想要使用并在多个应用程序进程或其他应用程序之间共享的连接类型的逻辑名称。正确的连接类集合可以有效地划分连接,并避免连接之间不必要的会话共享。

**默认情况下,DRCP 连接不会在数据库用户和服务名称之间共享。**连接类增加了一层额外的共享边界,当应用程序使用相同的用户名和服务名称时,这些边界可以维持。需要会话中不同状态的应用程序应该使用不同的用户名和/或连接类。

如果没有空闲的池化服务器与指定连接类中用户 ID 的请求匹配,并且池已达到其最大大小,则将使用池中具有不同类的空闲服务器,并为其创建新的会话。如果没有可用的池化服务器,连接请求将等待一个可用的服务器。此行为允许数据库继续运行而不会过载。

例如,对于同一个用户名“Blake”,Sales 组中的应用程序可能愿意在彼此之间共享池化服务器,但不愿意与 CRM 组共享。在下图中,组名“Sales”和“CRM”也是为连接类设置的值。
在这里插入图片描述

图 3:跨应用程序共享 DRCP 池

什么是会话纯度?

会话纯度 (Session Purity) 属性指定应用程序是需要“全新”会话 (NEW),还是将应用程序逻辑设置为重用“池化”会话 (SELF)。此属性控制 DRCP 中池化会话的可重用性。重用池化会话将提高连接性能。

DRCP 会话纯度和连接类别的默认值

DRCP 连接的连接类别和纯度属性将根据应用程序是否使用本地连接池具有默认值。

DRCP 连接设置来自应用程序连接池的连接的默认值非来自应用程序连接池的连接的默认值
纯度SELFNEW
连接类对于使用 Oracle 调用接口 (OCI) 库的应用程序,每个应用程序会话池随机生成的唯一名称将用作会话池中所有连接的默认连接类。Python-oracledb Thin 模式默认生成一个带有前缀“DPY”的唯一连接类名。Node-oracledb Thin 模式默认生成一个带有前缀“NJS”的唯一连接类名。对于 JDBC Thin,如果设置了 UCP,则默认值为指定的连接池名称。如果未设置 UCP,则该类将获取一个随机名称。在托管和核心 ODP.NET 中,默认值为 null。“SHARED”

表 5 – 会话纯度和连接类别默认值

连接字符串中的会话纯度和连接类别

许多数据库驱动程序都允许应用程序将连接类别和连接纯度值设置为属性。但是,当无法通过应用程序代码设置这些属性值,或者这些值并非最佳时,您可以在连接字符串中设置参数 POOL_CONNECTION_CLASS 和 POOL_PURITY。如果服务器不是 POOLED 类型的,则这两个参数将被忽略。

连接字符串中指定的 POOL_CONNECTION_CLASS 和 POOL_PURITY 属性将具有最高优先级,并覆盖默认值或应用程序指定的值(通过 Oracle 调用接口 (C/C++) 中的 OCI OCIAttrSet 或 OCISessionGet 调用设置,或通过 Python、JDBC 和 ODP.NET 瘦驱动程序设置)。

POOL_PURITY 的有效值为 SELF 和 NEW。这些值不区分大小写。

注意:在连接字符串中使用 SELF 时,即使应用程序在 OCISessionRelease() 中通过了 OCI_SESSRLS_DROPSESS 模式,任何具有应用程序属性 NEW 纯度的会话请求都不会从应用程序池中删除。

POOL_CONNECTION_CLASS 的值可以是任何符合连接类语义的字符串。该值区分大小写。

-- Easy Connect 字符串示例:
oraclehost:1521/db_svc1:pooled?pool_purity=self&pool_connection_class=ccname

在 Easy Connect 语法中,pool_connection_class 和 pool_purity 属性可在 Oracle Database 21c 及更高版本中使用。如果应用程序使用 Oracle Client 库,则这些属性在 Oracle Client 12 或更高版本的 Easy Connect 语法中受支持。

有关这些 DRCP 参数用法的更多信息,请查看最新的 Easy Connect 语法技术简介。

-- 网络连接描述符字符串示例:
ServerPool = (DESCRIPTION = 
(ADDRESS=(PROTOCOL=tcp)(HOST=oraclehost)(PORT=1521)) 
(CONNECT_DATA=(SERVICE_NAME=db_svc1)(SERVER=POOLED)) 
(POOL_CONNECTION_CLASS=CCNAME)(POOL_PURITY=SELF))

每个 PDB 的 DRCP

Oracle Database 12c 中引入的多租户选项引入了容器数据库 (CDB) 和可插拔数据库 (PDB) 模型。所有 PDB 只能使用一个 DRCP 池,并且由拥有 SYSDBA 权限的 ROOT 用户在 CDB 级别进行管理。这被称为“CDB DRCP”。

从 Oracle Database 21c 开始,DRCP 可以位于 CDB 级别(CDB DRCP)或 PDB 级别(每个 PDB DRCP)。在“每个 PDB DRCP”模式下,PDB 管理员用户(例如 PDB1ADMIN)可以配置、管理和监控该 PDB 拥有的 DRCP 池。代理仍然归 ROOT 所有,并由所有每个 PDB 的 DRCP 池共享。

启用每个 PDB 的 DRCP

默认情况下,DRCP 位于 CDB 级别。在 CDB DRCP 模式下,CDB 中运行的单个 DRCP 池由所有 PDB 共享。在此模式下,数据库初始化参数 ENABLE_PER_PDB_DRCP 将设置为“FALSE”。

可以将 ENABLE_PER_PDB_DRCP 设置为“TRUE”以启用每个 PDB 的 DRCP。

为了使 PDB1ADMIN 用户能够访问 DBMS_CONNECTION_POOL 包并查询 DRCP 统计信息,ROOT 用户 (SYS) 必须向 PDB1ADMIN 授予以下权限。

GRANT CREATE SESSION, CREATE SYNONYM TO PDB1ADMIN; 
GRANT EXECUTE ON DBMS_CONNECTION_POOL TO PDB1ADMIN; 
GRANT SELECT ON V_$CPOOL_STATS TO PDB1ADMIN; 
GRANT SELECT ON V_$CPOOL_CC_STATS TO PDB1ADMIN; 
GRANT SELECT ON V_$CPOOL_CONN_INFO TO PDB1ADMIN; 
GRANT SELECT ON V_$CPOOL_CC_INFO TO PDB1ADMIN; 
GRANT SELECT ON V_$AUTHPOOL_STATS TO PDB1ADMIN;

为了使 DRCP 池的管理和监控更加容易,PDB 管理员用户(在本例中为 PDB1ADMIN)可以创建以下同义词。

CREATE SYNONYM DBMS_CONNECTION_POOL FOR SYS.DBMS_CONNECTION_POOL;
CREATE SYNONYM V$CPOOL_STATS FOR SYS.V_$CPOOL_STATS; 
CREATE SYNONYM V$CPOOL_CC_STATS FOR SYS.V_$CPOOL_CC_STATS; 
CREATE SYNONYM V$CPOOL_CONN_INFO FOR SYS.V_$CPOOL_CONN_INFO; 
CREATE SYNONYM V$CPOOL_CC_INFO FOR SYS.V_$CPOOL_CC_INFO; 
CREATE SYNONYM V$AUTHPOOL_STATS FOR SYS.V_$AUTHPOOL_STATS;

完成此操作后,仅允许相应的 PDB 管理员在 PDB 级别进行池管理。

CDB DRCP 与每个 PDB 的 DRCP

在 CDB DRCP 中,DBA ROOT 用户(例如 SYS)管理 CDB 中的 DRCP 池。所有 PDB 共享此 DRCP 池。

从 CDB 管理池从 PDB 管理池从 CDB 查看池统计信息从 PDB 查看池统计信息
ROOT 用户可以连接到 CDB 时运行 dbms_connection_pool 包的所有过程,例如 start_pool() 和 stop_pool()。如果已通过 init.ora 或 ALTER SYSTEM 设置了数据库参数 connection_brokers,则 alter_param() 过程无法修改 DRCP 配置参数 num_cbrok 和 maxconn_cbrok。任何用户都不能从 PDB 管理 CDB DRCP。ROOT 用户可以查询以下 gv$ 表:gv$cpool_stats gv$cpool_cc_stats gv$cpool_conn_info gv$authpool_stats gv$cpool_cc_info,它们对应的 v$tables 和 DBA_CPOOL_INFO。连接到 PDB 的 ROOT 用户只能从 gv$cpool_conn_info 和 gv$authpool_stats 及其对应的 v$ 表查看统计信息。

表 6 – CDB DRCP 行为

在每个 PDB DRCP 中,PDB 管理员用户管理每个单独的 PDB 的 DRCP 池。

从 CDB 管理池从 PDB 管理池从 CDB 查看池统计信息从 PDB 查看池统计信息
当连接到 CDB 时,ROOT 用户或 PDB 管理员用户无法运行 dbms_connection_pool 包中的过程。ROOT 用户可以使用数据库参数 connection_brokers 更改 num_cbrok 和 maxconn_cbrok 的值。只有 PDB 管理员用户才能在连接到 PDB 时运行 dbms_connection_pool 包的所有过程,例如 start_pool() 和 stop_pool()。alter_param() 过程无法修改 DRCP 配置参数 num_cbrok 和 maxconn_cbrok。PDB 管理员用户无法更改数据库参数 connection_brokers。ROOT 用户可以查询以下 gv t a b l e s 以及连接到 C D B 的相应 v tables 以及连接到 CDB 的相应 v tables以及连接到CDB的相应v 表。gv$cpool_stats gv$cpool_cc_stats gv$cpool_conn_info gv$authpool_stats gv$cpool_cc_info 结果将包含有关所有 PDB 的 DRCP 信息。PDB 管理员用户或 ROOT 用户可以查询 PDB 中的以下 gv$tables:gv$cpool_stats、gv$cpool_cc_stats、gv$cpool_conn_info、gv$authpool_stats、gv$cpool_cc_info,以及它们对应的 v$tables 和 DBA_CPOOL_INFO。查询结果将包含特定 PDB 的 DRCP 信息。

使用 DRCP 的隐式连接池

Oracle Database 23ai 引入了隐式连接池 (Implicit Connection Pooling)。该功能可与 DRCP 配合使用,使数据库能够根据 SQL 或 PL/SQL 事务中的特定边界要求自动释放连接/会话,并减少应用程序的池管理责任。隐式连接池可与每个 PDB 的 DRCP 和 CDB 的 DRCP 配合使用。

DRCP 的隐式连接池会检测数据库连接/会话何时处于无状态(无打开的游标、临时 LOB、临时表或活动事务),并对数据库连接执行“隐式释放”。

“隐式释放”过程包含两个步骤:

  • 将连接交还给连接代理
  • 将池中的服务器连同会话一起返回到 DRCP 的“空闲服务器”池。

“隐式释放”过程在应用程序不知情的情况下发生。后续对该连接的数据库调用会从 DRCP 池中隐式获取一个会话。

使用 DRCP 的隐式连接池适用于以下应用:

  • 不执行数据库工作时持有连接
  • 使用自定义连接池或根本不使用连接池
  • 负载处理稀疏但重复
  • 包含难以迁移到 Oracle 连接池 API 的旧代码或第三方代码

请参阅隐式连接池博客,了解更多详情。

启用隐式连接池

要使应用程序能够使用隐式连接池,首先需要在数据库服务器上配置 DRCP。

在应用程序端,您需要在连接字符串中设置 POOL_BOUNDARY 选项,以使应用程序能够使用隐式连接池。POOL_BOUNDARY 选项可以有两个值:

  • STATEMENT – 当数据库会话处于无状态时,DRCP 执行“隐式释放”。
  • TRANSACTION – 当数据库会话处于无状态时,DRCP 执行“隐式释放”。此释放操作将在提交/回滚时关闭所有活动游标、临时表和临时 LOB。
-- 具有隐式连接池的 Easy Connect 字符串示例:
oraclehost:1521/db_svc_name:pooled?pool_boundary=statement

-- 具有隐式连接池的示例网络连接描述符字符串:
DBServerPool = (DESCRIPTION = 
(ADDRESS=(PROTOCOL=tcp)(HOST=oraclehost)(PORT=1521))
(CONNECT_DATA=(SERVICE_NAME=db_svc_name)(SERVER=POOLED) 
(POOL_BOUNDARY=STATEMENT))

对于隐式连接池中的连接,会话纯度值默认为“SELF”。隐式连接池无需对应用程序进行任何其他更改。

隐式连接池的优势

隐式连接池 (DRCP) 增强了数据库连接的复用能力,无需依赖应用程序显式打开或关闭连接调用。它允许长时间保持连接的应用程序共享其数据库服务器进程和会话内存。这减轻了数据库主机的负载,并提高了整个系统的可扩展性。
总而言之,隐式连接池 (DRCP) 为应用程序带来以下优势:

  • 通过更佳的多路复用功能提高应用程序的可扩展性
  • 减少应用程序端所需的池处理
  • 通过优化数据库资源利用率,支持中间层更高的并发性

多池 DRCP(命名池)

Oracle Database 23ai 引入了多池 DRCP 功能,支持创建具有不同配置的多个命名池。借助此功能,数据库管理员可以添加或删除 DRCP 池。多池 DRCP 可以在 CDB 和 PDB 级别配置。应用程序必须在连接字符串中指定池名称才能访问特定的 DRCP 池。

多池 DRCP 为数据库管理员 (DBA) 提供了配置灵活性,并有助于根据传入的应用程序请求类型组织数据库连接。

在这里插入图片描述
图 4:多池 DRCP 架构

添加和删除命名池

新的 PL/SQL 过程 dbms_connection_pool.add_pool() 会添加新的连接池。

要使用默认连接池参数添加名为“my_pool”的新连接池,请运行以下命令:

execute dbms_connection_pool.add_pool('my_pool')

要删除“my_pool”,请运行:

execute dbms_connection_pool.remove_pool('my_pool')

配置多池 DRCP

除了启用 DRCP 之外,多池 DRCP 不需要在数据库服务器上进行其他配置。

应用程序需要在连接字符串中指定 (POOL_NAME=<pool_name>),并在 DRCP 中指定 (SERVER=POOLED),以便将客户端连接标记到相应的池中。例如:

(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=host_name)(PORT=port_number)) 
(CONNECT_DATA=(SERVICE_NAME=db_service.company.com>)(SERVER=POOLED) 
(POOL_NAME=my_pool)))

如果您使用 Easy Connect String,那么您可以按如下方式指定池名称:

host_name:port_number/db_service.company.com:pooled?pool_name=my_pool

您可以使用 DBMS_CONNECTION_POOL 包中的 PL/SQL 过程,按照本文档“在服务器端启用和配置 DRCP”部分中的说明,配置类似于默认 DRCP 池的命名池。请注意,启用 DRCP 后,SYS_DEFAULT_CONNECTION_POOL 仍将自动创建,并保留为默认 DRCP 池。

有关配置和使用多池 DRCP 的更多详细信息,请查看博客“Oracle Database 23ai 中的多池数据库驻留连接池 (DRCP)”。

监控DRCP

Oracle 数据库中提供内置数据字典视图和动态性能视图,用于监控 DRCP 的性能。数据库管理员可以查看统计信息,例如繁忙和空闲服务器的数量,以及池中命中和未命中的次数与客户端请求总数的对比情况。
Oracle 数据库中可用于查看 DRCP 统计信息的内置视图包括:

DBA_CPOOL_INFO
V$CPOOL_STATS
V$CPOOL_CC_STATS
V$CPOOL_CONN_INFO
V$CPOOL_CC_INFO
V$AUTHPOOL_STATS

在以下小节中,我们将使用 SQL*Plus 查询 DRCP 的数据字典视图。

DBA_CPOOL_INFO

DBA_CPOOL_INFO 视图显示有关连接池的配置信息,例如池状态、最大和最小连接数等。以下示例检查池是否已启动(ACTIVE 状态)并查找允许的最大池服务器数量:

SQL> SELECT connection_pool, status, maxsize FROM dba_cpool_info; 
CONNECTION_POOL STATUS MAXSIZE
 ---------------------------- ---------- ----------
 SYS_DEFAULT_CONNECTION_POOL ACTIVE 40

V$CPOOL_STATS View

V C P O O L S T A T S 视图显示数据库实例的 D R C P 统计信息。 V CPOOL_STATS 视图显示数据库实例的 DRCP 统计信息。V CPOOLSTATS视图显示数据库实例的DRCP统计信息。VCPOOL_STATS 视图可以评估连接池设置的效率。
以下示例中的查询显示了一个应用程序如何有效地使用连接池。较低的未命中次数表明服务器和会话已被共享应用程序重用,并且纯度达到“SELF”。等待计数显示,略高于 10% 的请求必须等待池服务器可用:

SQL> SELECT num_requests, num_hits, num_misses, num_waits FROM v$cpool_stats; 
NUM_REQUESTS NUM_HITS NUM_MISSES NUM_WAITS 
------------ ---------- ---------- ----------
 10031		 99990 		40 			1055

如果设置了连接类别(允许池服务器和会话重用),则 NUM_MISSES 会较低。如果池最大大小值对于连接负载而言太小,则 NUM_WAITS 会较高。

启用 CDB 级 DRCP 后,此视图仅在从 CDB 根目录(SYS 用户)查询时返回数据,从 PDB 查询时返回 0 行。启用每个 PDB 的 DRCP 后,此视图在从 CDB 根目录(SYS 用户)和 PDB(PDBADMIN 用户)查询时均会返回数据。

注意:SQL*Plus 默认不设置 PURITY,因此不会重用 DRCP 会话。

V$CPOOL_CC_STATS View

视图 V$CPOOL_CC_STATS 包含每个实例的连接池的连接类级别统计信息。例如:

SQL> SELECT cclass_name, num_requests, num_hits, num_misses FROM v$cpool_cc_stats; 
CCLASS_NAME NUM_REQUESTS NUM_HITS NUM_MISSES
---------------------------- ------------- -------- -----------
HR.MYCLASS					 100031 		99993 	38

启用 CDB 级 DRCP 后,此视图仅在从 CDB 根(SYS 用户)查询时返回数据,从 PDB 查询时返回 0 行。对于每个 PDB 的 DRCP,此视图在从 CDB(根用户)和 PDB(PDBADMIN 用户)查询时均会返回数据。

在 Oracle Database 23ai 中,V$CPOOL_CC_STATS 视图中添加了一个新的 POOL_NAME 列,用于维护命名池(如果有)的连接类统计信息。

V$CPOOL_CONN_INFO View

您可以监视视图 V$CPOOL_CONN_INFO 来识别配置错误的计算机,例如未正确设置连接类的计算机。此视图显示与连接代理的每个连接的连接信息。以下示例中的查询将计算机名称映射到类名称:

SQL> SELECT cclass_name, machine FROM v$cpool_conn_info;
CCLASS_NAME MACHINE
--------------------------------------- ------------
 GK.OCI:SP:wshbIFDtb7rgQwMyuYvodA 		gklinux

在此示例中,您将检查 Linux 计算机 (gklinux) 上的应用程序,并确保已设置 cclass。更多 V$CPOOL_CONN_INFO 视图的使用示例可在此处找到。

在 Oracle Database 23ai 中,此视图添加了一个新的 POOL_NAME 列,用于维护命名池(如果有)的连接池信息。

V$CPOOL_CC_INFO View

V$CPOOL_CC_INFO 保存每个数据库实例的 DRCP 池的池到连接类映射信息。以下示例中的查询标识了数据库实例中的所有连接类:

SQL> SELECT pool_name, cclass_name FROM v$cpool_cc_info;
POOL_NAME CCLASS_NAME CON_ID 
---------------------------------------- ------------------------------ ------
SYS_DEFAULT_CONNECTION_POOL 				HR.MYCLASS 					3

在此示例中,用户是 HR,连接类是 MYCLASS。

V$AUTHPOOL_STATS View

V$AUTHPOOL_STATS 显示 DRCP 身份验证服务器的统计信息。此视图从 Oracle Database 21c 及更高版本开始可用。以下示例中的查询查看身份验证服务器统计信息:

SQL> select num_srvs, num_busy, num_free, num_waiters from v$authpool_stats; 
NUM_SRVS NUM_BUSY NUM_FREE NUM_WAITERS
---------- ---------- ---------- -----------
 3 			0 			3 			0

上面的例子显示有三个认证服务器进程空闲并准备接收任何连接认证请求。

不同语言的 DRCP 示例

要在应用程序中启用并使用 DRCP,我们必须:

  1. 在数据库中配置并启用 DRCP
  2. 配置应用程序以使用 DRCP 连接
  3. 部署应用程序

如果在未配置数据库 DRCP 的情况下执行以下代码片段,则连接将无法成功,并且会向应用程序返回错误。

使用 Python 的 DRCP

Oracle 数据库的最新 Python 接口 python-oracledb(包名:oracledb)支持 DRCP。

DRCP 的应用程序部署

要请求数据库使用 DRCP 池化服务器,您可以在 oracledb.create_pool() 或 oracledb.connect() 中使用类似于以下语法之一的特定连接字符串。
使用 Oracle 的 Easy Connect 语法,连接参数如下所示:

import oracledb
connection = oracledb.connect(user="hr", password=userpwd, 
dsn="dbhost.example.com/orcl:pooled”, 
cclass="MYAPP")

或者,如果您使用名为 customerdb 的 tnsnames.ora 别名进行连接:

connection = oracledb.connect(user="hr", password=userpwd, 
dsn="customerdb")

此时只需要修改Oracle Network配置文件tnsnames.ora:

customerdb = (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=dbhost.example.com) 
(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=CUSTOMER)(SERVER=POOLED)))

您还可以在创建独立连接或 python-oracledb 连接池时通过设置 server_type 参数来指定使用 DRCP 池化服务器。

pool = oracledb.create_pool(user="hr", password=userpwd, 
dsn="dbhost.example.com/orclpdb", min=2, max=5, increment=1, 
server_type="pooled")

设置连接类别和纯度属性

此用户选择的名称提供了 DRCP 会话内存的分区。因此,重用仅限于类似的应用程序。如果启动了多个应用程序进程,它可提供最大程度的池共享。

要使用连接类名称(cclass 属性)创建请求 DRCP 服务器的应用程序连接池并获取连接,请执行以下操作:

pool = oracledb.create_pool(user="hr", password=userpwd, 
dsn="dbhost.example.com/orclpdb:pooled", 
min=2, max=5, increment=1, 
cclass="MYAPP") 

connection = pool.acquire()

默认情况下,池中所有连接的纯度将设置为 SELF(python-oracledb 中的 PURITY_SELF 值),这也是推荐的最佳实践。
python-oracledb 连接池大小无需与 DRCP 池大小匹配。DRCP 池大小决定了整体执行并行度的限制。
连接类名也可以传递给 acquire() 函数:

connection = pool.acquire(cclass="OTHERAPP")

要将池连接纯度更改为 NEW,请使用 acquire() 函数将纯度属性设置为 PURITY_NEW。

connection = pool.acquire(cclass="MYAPP", purity=oracledb.PURITY_NEW)

您可以使用此连接对象来运行任何数据库事务。

with connection.cursor() as cursor:
	print("Performing query using DRCP...")
		for row in cursor.execute("select sysdate from dual"):
			print(row)

此代码片段将打印数据库主机的当前系统日期。

如果未设置 cclass 参数和 SELF 纯度,则池化服务器会话将无法得到最佳重用,并且 DRCP 统计视图可能会记录较大的 NUM_MISSES 值。

DRCP 允许每次从池中获取连接时重用或清理连接的会话内存。在创建池或连接时,纯度参数值可以是 PURITY_NEW、PURITY_SELF 或 PURITY_DEFAULT。默认情况下,python-oracledb 池化连接使用 PURITY_SELF,独立连接使用 PURITY_NEW。

在连接字符串中设置连接类别和纯度

对于 python-oracledb Thin 模式,您可以在 Oracle 数据库(从 21c 版本开始)的 Easy Connect 字符串中指定连接类别和纯度。这样,当您想使用 DRCP 时,就无需修改现有应用程序:

dsn = "localhost/orclpdb:pooled?pool_connection_class=MYAPP&pool_purity=self"

使用 Node.js 的 DRCP

略。

使用 JDBC 的 DRCP

略。

使用 Oracle 调用接口 (OCI) 的 DRCP

略。

使用 Oracle 调用 C++ 接口 (OCCI) 的 DRCP

略。

使用 ODP.NET 的 DRCP

略。

使用 PHP 的 DRCP

略。

DRCP 常见问题


问题 1:如何检查和调整连接代理的数量?
可以使用以下 SQL 语句检查和调整连接代理的数量:

SQL> select num_cbrok from DBA_CPOOL_INFO;
NUM_CBROK
----------
1

要设置连接代理,请按照表 3 所述设置 NUM_CBROK DRCP 配置选项。

SQL> select num_cbrok from DBA_CPOOL_INFO;
NUM_CBROK
----------
2

对于大量并发连接请求,建议增加连接代理的数量,因为单个连接代理可能会过载(代理的 CPU 使用率高表示)。


问题 2:如果有多个连接代理,有什么方法可以检查各个连接代理进程之间的连接分配负载?
关于连接分配负载,您可以在 v$cpool_conn_info 中查看,如下所示:

SQL> select cmon_addr, count(*) from v$cpool_conn_info group by cmon_addr;
CMON_ADDR COUNT(*)
---------------- ----------
000000014BE63E40 500
000000014BE64198 500

在上面的示例中,每个连接代理进程建立了 500 个客户端连接。总共建立了 1000 个与 DRCP 的连接。


问题 3:当应用程序与连接代理有连接时,我可以停止 DRCP 池吗?

Oracle Database 23ai 在 dbms_connection_pool.stop_pool() 中引入了 DRAINTIME 参数,该参数可配置为立即中止所有池化服务器并停止池。

在此版本之前,当客户端与代理建立连接时,您无法停止池。


问题 4:我是否应该重新启动 DRCP 池来更改连接代理的数量?

如果您要增加代理数量,则无需重启池。如果您要减少代理数量,请等待客户端/应用程序断开连接。

连接代理负责管理连接的签入/签出,如果代理数量增加,它们会分担负载,不会增加 CPU 使用率。连接代理进程仅在客户端连接或主动请求并释放池化服务器时占用 CPU。


问题 5:连接代理的数量限制是多少?它可以同时处理多少个连接请求?

DRCP 连接代理的数量没有硬编码限制,因为它完全取决于工作负载。Oracle 的自动工作负载存储库 (AWR) 报告可以深入了解连接代理的负载情况。这可以指示是否需要增加连接代理进程的数量。


问题 6:DRCP 支持 TCPS 连接吗?

不,截至本文发布时,它尚不支持 TCPS 连接。


问题 7:在 DRCP 中增加 MAX_AUTH_SERVERS 参数后,如何验证身份验证服务器 (num_auth) 会话的数量(使用 SQL 查询跟踪身份验证效果的提升)

如果您拥有足够数量的身份验证服务器,则应该不会看到任何网络 (TNS) 错误。

如果您想随时查看有多少个身份验证服务器,可以以 root DBA 用户身份在 Oracle Database 19c 中查询。

SQL> select kmpcpname as pool, kmpcpnsrv as num_srvs, kmpcpbsrv as num_busy, kmpcpfsrv as num_free, (kmpcpawait+kmpcpswait) as num_waiters from x$kmpcp where kmpcpstate != 0;
POOL NUM_SRVS NUM_BUSY NUM_FREE NUM_WAITERS
------------------------------ ---------- ---------- ---------- -----------
SYS_AUTH_POOL 1 0 1 0 SYS_DEFAULT_CONNECTION_POOL 4 1 3 0

从 Oracle Database 21c 开始的未来 DB 版本中,您将拥有相同的 V$AUTHPOOL_STATS 视图。


问题 8:如何增加 DRCP 中允许的身份验证服务器进程数量?

身份验证服务器的数量受数据库初始化参数 MAX_AUTH_SERVERS 的限制。此参数的默认值为 40。

要增加 DRCP 中的身份验证服务器进程数量,您需要以具有所需权限的用户(根 DBA 或 PDB 管理员用户,视具体情况而定)在数据库中增加 MAX_AUTH_SERVERS 值,如下所示:

SQL> ALTER SYSTEM SET MAX_AUTH_SERVERS = 100

问题 9:如果连接代理和身份验证服务器的数量增加,会对基础架构的哪些方面产生影响?

连接代理和身份验证服务器数量的增加会影响数据库主机的 CPU。

结论

DRCP 允许应用程序使用跨多个应用服务器和中间层部署共享的数据库中的连接池。这些应用程序必须主动将数据库活动与获取或释放会话的调用包装在一起,才能有效地使用 DRCP。此类应用程序可以快速建立连接,并在大量连接中使用最少的数据库资源。

Oracle 的数据库代理解决方案,流量导向模式下的连接管理器 (CMAN-TDM),拥有自己的池化特性——代理驻留连接池 (PRCP),其工作原理与 DRCP 类似。如果应用程序与 DRCP 配合良好,那么它与 PRCP 配合也同样良好。对于 PRCP,唯一需要(在应用程序端)进行的更改是将 tnsnames.ora 别名或 Easy Connect 字符串指向 PRCP 服务器,而不是数据库/DRCP 服务器。

总而言之,DRCP 的优势如下:

  • DRCP 允许在多个客户端应用程序和应用服务器之间共享资源
  • DRCP 通过减少数据库主机上的资源使用量来提高数据库和应用程序的可扩展性

更多信息

更多信息,请参阅以下链接和文档:

  • 了解 DRCP,Oracle 数据库管理员指南
  • 使用数据库驻留连接池,Oracle 数据库开发人员指南
  • 数据库驻留连接池,Oracle 数据库概念
  • 数据库驻留连接池,Oracle 调用接口程序员指南
  • 数据库驻留连接池,Oracle .NET 数据提供程序开发人员指南
  • 数据库驻留连接池,Oracle JDBC 开发人员指南
  • 新的 DRCP 参数,Oracle 新特性指南
  • CMAN-TDM – 适用于可扩展和高可用性应用程序的 Oracle 数据库连接代理,CMAN-TDM 技术简介
  • Oracle Database Easy Connect Plus,Easy Connect 和 Easy Connect Plus 技术简介
  • 使用池化和缓存进行应用程序编程,Oracle 数据库资源池化和缓存技术简介
  • GOL 使用 Oracle 云基础设施在 60 秒内跟踪购票情况,Oracle 客户案例
  • 多池 DRCP 博客,Oracle Database 23ai 中的多池数据库驻留连接池 (DRCP)
  • 隐式连接博客,当连接导致数据库过载时使用隐式连接池

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2340674.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FastAPI WebSocket 聊天应用详细教程

项目简介 这是一个基于 FastAPI 和 WebSocket 实现的实时聊天应用&#xff0c;支持一对一聊天、离线消息存储等功能。 技术栈 后端&#xff1a;FastAPI (Python)前端&#xff1a;HTML、JavaScript、CSS通信&#xff1a;WebSocket认证&#xff1a;简单的 token 认证 项目结构…

vue3+canvas裁剪框样式【前端】

目录 canvas绘制裁剪框&#xff1a;拖拽改变框的大小&#xff1a;圆圈样式&#xff1a;方块样式&#xff1a; canvas绘制裁剪框&#xff1a; // 绘制裁剪框 const drawCropRect (ctx: CanvasRenderingContext2D): void > {if (cropRect.value.width > 0 && crop…

软件功能测试和非功能测试有什么区别和联系?

软件测试是保障软件质量的核心环节&#xff0c;而软件功能测试和非功能测试作为测试领域的两大重要组成部分&#xff0c;承担着不同但又相互关联的职责。 软件功能测试指的是通过验证软件系统的各项功能是否按照需求规格说明书来正确实现&#xff0c;确保软件的功能和业务流程…

10_C++入门案例习题: 结构体案例

案例描述 学校正在做毕设项目&#xff0c;每名老师带领5个学生&#xff0c;总共有3名老师&#xff0c;需求如下 设计学生和老师的结构体&#xff0c;其中在老师的结构体中&#xff0c;有老师姓名和一个存放5名学生的数组作为成员 学生的成员有姓名、考试分数&#xff0c; 创建…

快速定位达梦缓存的执行计划并清理

开发告诉你一个sql慢&#xff0c;你想看看缓存中执行计划时&#xff0c;怎么精准快速定位&#xff1f; 可能一般人通过文本内容模糊搜索 select cache_item, substr(sqlstr,1,60)stmt from v$cachepln where sqlstr like %YOUR SQL STRING%; 搜出来的内容比较多&#xff0c;研…

若依、vben-admin、三维可视化

对三维可视化&#xff0c;包括cesium、模型加载、GIS有关的项目和技术都可以私信&#xff0c;包括基础数据后台管理系统的搭建和配置

LLMs可在2位精度下保持高准确率

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

爆改 toxml 组件 支持数据双向绑定 解决数据刷新问题

GGGGGGGGGGGGGGGGGithub地址自行研究 sbfkcel/towxml: 微信小程序HTML、Markdown渲染库https://github.com/sbfkcel/towxml原组件是以导入数据渲染信息为目的、本文以AI数据返回小程序为模拟效果演示 默认情况只在ready 环节进行渲染静态资源 1、对传入数据容器的位置做处理 …

Unreal如何使用后处理材质实现一个黑屏渐变效果

文章目录 前言相机后期处理材质创建材质相机设置动态修改FadeAlpha参数使用示例最后前言 UE5 开发VR ,如何通过PostProcess轻松实现黑屏渐变效果 最简单的办法,其实是使用一个半球形模型,遮挡住相机,然后控制这个半球形遮罩的颜色透明度,至少Unity中默认的Tunneling是这么…

DB-GPT支持mcp协议配置说明

简介 在 DB-GPT 中使用 MCP&#xff08;Model Context Protocol&#xff09;协议&#xff0c;主要通过配置 MCP 服务器和智能体协作实现外部工具集成与数据交互。 开启mcp服务&#xff0c;这里以网页抓取为例 npx -y supergateway --stdio "uvx mcp-server-fetch" …

CoT-Drive:利用 LLM 和思维链提示实现自动驾驶的高效运动预测

25年3月来自澳门大学和 MIT 的论文“CoT-Drive: Efficient Motion Forecasting for Autonomous Driving with LLMs and Chain-of-Thought Prompting”。 准确的运动预测对于安全的自动驾驶 (AD) 至关重要。本研究提出 CoT-Drive&#xff0c;这是一种利用大语言模型 (LLM) 和思…

Flowable7.x学习笔记(十)分页查询已部署 BPMN XML 流程

前言 上一篇文章我们已经完成了流程的部署功能&#xff0c;那么下一步就是要激活流程了&#xff0c;但是我们要需要明确的指定具体要激活部署后的哪一条流程&#xff0c;所以我们先把已部署的基础信息以及具体定义信息分页查询出来&#xff0c;本文先把基础代码生成以及完成分页…

Office文档图片批量提取工具

Office.Files.Images 是一款专注于从 Word、Excel、PPT 等 Office 文档中批量提取图片的轻量级工具&#xff0c;支持 .docx、.xlsx、.pptx 格式文件。该软件体积仅 ‌343KB‌&#xff0c;无需安装即可运行&#xff0c;通过拖拽操作实现快速解析与导出&#xff0c;尤其适合需批量…

33-公交车司机管理系统

技术&#xff1a; 基于 B/S 架构 SpringBootMySQLvueelementui 环境&#xff1a; Idea mysql maven jdk1.8 node 用户端功能 1.首页:展示车辆信息及车辆位置和线路信息 2.模块:车辆信息及车辆位置和线路信息 3.公告、论坛 4.在线留言 5.个人中心:修改个人信息 司机端功能…

PyCharm 初级教程:从安装到第一个 Python 项目

作为 Python 程序员&#xff0c;无论是刚入门还是工作多年&#xff0c;PyCharm 都是一个绕不开的开发工具。它是 JetBrains 出品的一款强大的 Python IDE&#xff0c;有自动补全、调试、虚拟环境支持、代码检查等等功能&#xff0c;体验比命令行 记事本舒服一百倍。 今天这篇…

QML FontDialog:使用FontDialog实现字体选择功能

目录 引言相关阅读FontDialog基本介绍字体属性 实例演示项目结构代码实现Main.qmlmain.cpp 代码解析运行效果 总结 引言 在桌面应用程序开发中&#xff0c;字体选择是一个常见的需求。Qt Quick提供了FontDialog组件来实现这一功能。本文将介绍如何在Qt Quick应用程序中使用Fon…

力扣刷题Day 27:环形链表(141)

1.题目描述 2.思路 创建一个结点集合&#xff0c;遍历链表&#xff0c;如果遇到已经加进集合的结点就说明链表有环。 3.代码&#xff08;Python3&#xff09; class Solution:def hasCycle(self, head: Optional[ListNode]) -> bool:node headnode_set set()while node…

研发效率破局之道阅读总结(3)工程优化

研发效率破局之道阅读总结(3)工程优化 Author: Once Day Date: 2025年4月22日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章可参考专栏: 程序的艺术_Once-Day…

metasploit(2)生成dll木马

声明&#xff01;本文章所有的工具分享仅仅只是供大家学习交流为主&#xff0c;切勿用于非法用途&#xff0c;如有任何触犯法律的行为&#xff0c;均与本人及团队无关&#xff01;&#xff01;&#xff01; 一、dll文件基本概念 DLL 是一种包含可由多个程序同时使用的代码和数…

数据结构--并查集-高效处理连通性问题

目录 一、理论基础 &#xff08;1&#xff09;并查集的功能及实现原理 &#xff08;2&#xff09;代码模版 &#xff08;3&#xff09;模拟过程 &#xff08;4&#xff09;应用 二、基础题练习 &#xff08;1&#xff09;寻找存在的路径&#xff08;模版题&#xff09; …