暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SOP for Oracle 23ai:Python 连接 Oracle 的两种方法

原创 严少安 2024-05-09
399

前情回顾

前文介绍了如何使用 python-oracledb 连接 Oracle 23ai 数据库,并演示了如何使用独立连接方式。

其中提到了支持两种连接池: DRCP 和 PRCP。

本文将对这两种连接池做具体演示。

DRCP 和 PRCP 连接池

连接池技术的优点不言而喻:

  1. 缩短连接时间和次数
  2. 复用连接和减小开销
  3. 简化应用开发

在 Oracle 数据库中,提供了两种主要的连接池技术:

  1. DRCP (Database Resident Connection Pooling)

DRCP 为整个 CDB 配置一个连接池,或者为每个 PDB 配置一个隔离的连接池。

这一行为由参数 ENABLE_PER_PDB_DRCP 控制,该参数默认为 false。[1]

默认情况下,DRCP 为整个 CDB 创建一个连接池。该连接池由所有 PDB 共享。

修改参数为 true 后, 整个 CDB 没有连接池,DRCP 为每个 PDB 创建一个隔离的连接池。你可以连接到特定的 PDB,并根据该 PDB 的特定要求配置、管理和监视其连接池。

SQL> show parameter enable_per_pdb_drcp NAME TYPE VALUE ------------------- ------- ----- enable_per_pdb_drcp boolean TRUE

在 PDB 中启用 DRCP。

EXECUTE DBMS_CONNECTION_POOL.START_POOL();

查看 DRCP 状态。

SQL> SELECT connection_pool, status, minsize, maxsize, INACTIVITY_TIMEOUT, CON_ID FROM dba_cpool_info; CONNECTION_POOL STATUS MINSIZE MAXSIZE INACTIVITY_TIMEOUT CON_ID ______________________________ _________ __________ __________ _____________________ _________ SYS_DEFAULT_CONNECTION_POOL ACTIVE 0 40 300 3
  1. PRCP (Proxy Resident Connection Pooling)

在 Oracle 23ai 中,引入隐式连接池特性,不使用应用程序连接池的客户端应用程序可以利用 CMAN-TDM 代理驻留连接池 (PRCP),而无需进行任何应用程序更改。

当应用程序启动和完成数据库操作时,即使应用程序没有显式关闭连接,新功能也可以在运行时自动将 PRCP 服务器分配给应用程序连接或从应用程序连接分配 PRCP 服务器。

在自治数据库中,可以启用每个 PDB PRCP 池,允许您整合每个 PDB 的连接池,并在属于同一 PDB 的多个服务之间共享这些会话。[2]

23ai 新视图: V$TDM_STATS

23ai 新引入一个动态性能视图: V$TDM_STATS

用于描述 Oracle 连接管理 Traffic Director 模式 (CMAN-TDM) 的统计信息。

SQL> desc V$TDM_STATS; Name Null? Type ________________________________ ________ ______________________________ CMAN_ID VARCHAR2(1024) GATEWAY_ID NUMBER SERVICE_NAME VARCHAR2(1024) PRCP_NUM_REQUESTS NUMBER PRCP_NUM_BUSY_CONNECTIONS NUMBER PRCP_NUM_OPEN_CONNECTIONS NUMBER PRCP_HISTORIC_MAX_CONNECTIONS NUMBER PRCP_NUM_WAITS NUMBER PRCP_NUM_WAITS_ACTIVE NUMBER PRCP_NUM_HITS NUMBER PRCP_NUM_INBOUND_CONNECTIONS NUMBER EDITION VARCHAR2(1024) UPDATED_TIME TIMESTAMP(6) WITH TIME ZONE CON_ID NUMBER

代码示例: DRCP

python-oracledb 2.1.0 中新增参数 pool_boundary 来配合 Oracle Database 23ai 中的 DRCP 或 PRCP 特性。

当参数值为 statement 时,则当连接为无状态(即,没有活动游标、活动事务、临时表或临时 LOB)时,池中的连接将隐式释放回 DRCP 或 PRCP 池。

当参数值为 transaction 时,则当调用 Connection.commit()Connection.rollback() 方法之一时,池中的连接将隐式释放回 DRCP 或 PRCP 池。[3]

完整示例代码如下:

import oracledb pool = oracledb.create_pool( user="SYS", password="1", dsn="127.1:1521/FREEPDB1:pooled?pool_boundary=transaction", mode=oracledb.AUTH_MODE_SYSDBA, cclass="ShawnAPP") with pool.acquire() as conn: cursor = conn.cursor() cursor.execute("select to_char(current_date)") (result,) = cursor.fetchone() print("NOW: ", repr(result)) print("See U.")

输出:

NOW:  '09-MAY-24'
See U.

V$CPOOL_CC_STATS

从 Oracle 11g 引入动态性能视图: V$CPOOL_CC_STATS

该视图显示有关每个实例的数据库驻留连接池的连接类级别统计信息。

通过查询该视图,可以看到,上面代码已经发出 15 次请求。

select cclass_name, num_requests, num_hits, num_misses 
from v$cpool_cc_stats;
CCLASS_NAME        NUM_REQUESTS    NUM_HITS    NUM_MISSES 
_______________ _______________ ___________ _____________
SYS.ShawnAPP                 15           0            15

其他视图

与 连接池 相关的动态性能视图,还有:

  • V$CPOOL_CC_INFO: 显示有关每个实例的数据库驻留连接池的池到连接类映射的信息。
  • V$CPOOL_CONN_INFO: 显示有关连接代理的每个连接的连接信息。
  • V$CPOOL_STATS: 显示有关实例的数据库驻留连接池统计信息。
  • V$AUTHPOOL_STATS: 显示身份验证池的统计信息。 当客户端应用程序连接到数据库驻留连接池 (DRCP) 时,此池将对用户连接进行身份验证。

以及,静态数据字典视图:

  • DBA_CPOOL_INFO: 显示有关数据库中所有 DRCP 的配置信息。

小结

本文介绍了 Oracle 中的 DRCP 和 PRCP 两种连接池,并以 Python 代码为例做演示。

下期,我们一起来学习如何使用 Java 连接 Oracle 23ai 数据库。

往期精彩

– END –

如果这篇文章为你带来了灵感或启发,就请帮忙点『赞』or『在看』or『转发』吧,感谢!(๑˃̵ᴗ˂̵)


  1. https://docs.oracle.com/en/database/oracle/oracle-database/23/refrn/ENABLE_PER_PDB_DRCP.html ↩︎

  2. https://docs.oracle.com/en/database/oracle/oracle-database/23/nfcoa/application_development.html ↩︎

  3. https://python-oracledb.readthedocs.io/en/latest/user_guide/connection_handling.html ↩︎

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论