上一篇文章介绍了oracle常用的四种链接方式:专用模式,会话池,DRCP和共享模式,原文链接
一文了解Oracle数据库如何连接(1) - 墨天轮
除了以上四种常规链接模式,还有三种高级模式本文在这里再做一下介绍
一. 同时使用客户端会话池和 DRCP
将用户界面和数据库分离的应用程序编程风格的最重要效果是:许多用户可以共享较少数量的数据库会话。可以将这一现象形象地比作一个漏斗。我们可以定义一个“漏斗系数”,即用户数量与数据库中的会话/进程数量的比值。
然而,漏斗系数的大小存在实际限制。在现代多线程应用程序的场景下,每个应用程序进程在其会话池中需要一定数量的最小会话。如果应用程序进程数量增长到数万甚至更多,这一最小会话数量可能会变得非常高,从而有过载数据库的风险。即使是设计良好的多线程应用程序,也可能需要额外的措施来保护数据库。
一种高效的方法是结合使用客户端池化和 DRCP,从而形成两个漏斗,如图 6 所示:
在这种模式下,应用程序代码与之前展示的多线程代码相同,但客户端会话池(如 Java 中的 UCP)通过 DRCP 连接到数据库。当工作线程调用以获取会话时,会发生以下两件事:
- 使用进程自身池中可用的一个会话。
- 通过 DRCP 代理(broker),将该会话与数据库中的实际会话关联。
队列和效率
- 两个步骤都有一个队列,因此可能需要等待,直到会话启动或可用。
- 但是,一旦会话分配给工作线程,就没有额外的开销。
- 由于存在两个漏斗,总漏斗系数可以更高,总漏斗系数是客户端漏斗系数和 DRCP 漏斗系数的乘积。
会话释放的要求
无论是仅使用客户端会话池还是单线程应用程序结合 DRCP,工作线程都必须在数据库操作完成后立即释放会话。会话释放后不能保留任何会话状态。
这种模式结合了客户端池化和 DRCP 的优势,进一步提升了数据库资源的利用效率,并减少过载的风险。
二. 代理驻留连接池 (Proxy Resident Connection Pooling, PRCP)
Oracle 提供了另一种技术,称为 代理驻留连接池(PRCP),该池驻留在代理服务器而非数据库服务器上。PRCP 的一个主要优势是,将池本身所需的资源从数据库服务器中分离出来,从而为实际的数据库工作节省宝贵的数据库服务器资源。
从应用程序端来看,PRCP 的实际行为与 DRCP 完全相同。PRCP 的部署不需要修改应用程序,只需连接到运行 PRCP 的服务器,而不是直接连接数据库服务器。PRCP 是 Oracle 连接管理器(Connection Manager, CMAN)的一部分,CMAN 是 Oracle 客户端完整安装的一部分。
图 7 显示了 PRCP 的工作原理。与图 4 中的 DRCP 模型相比,PRCP 的池化工作发生在数据库服务器之外:
在 PRCP 中,DRCP 中的代理进程(Broker)被连接管理器的多个线程和进程所取代。在外向端,连接管理器中的线程通过 TCP/IP 连接持有数据库会话。
与 DRCP 一样,客户端可以是单线程的。当客户端需要会话时,它们从 PRCP 内部的可用池中分配一个会话。由于池化操作不再由数据库执行,PRCP 节省了数据库资源。但这也引入了一个额外的网络跳跃(network hop),即应用程序与数据库之间需要通过代理服务器进行中转。
使用 PRCP 的要求
PRCP 提供了一种有效的方法来减少数据库服务器的负载,同时保留了与 DRCP 相似的操作方式。然而,由于额外的网络跳跃,其性能可能受到影响,因此需要根据实际应用场景权衡利弊。
三. 同时使用客户端会话池和 PRCP
正如多线程客户端可以将其会话池连接到 DRCP,多线程客户端也可以将其会话池连接到 PRCP。这种模式下,会有两个位置供工作线程排队以获取会话,因此形成两个漏斗。这在图 8 中有所展示:
需要注意的是,PRCP 的两个示意图显示的是 PRCP 的专用模式(dedicated mode),在此模式下,每个传入连接由一个专用线程处理。PRCP 还可以运行在**共享模式(shared mode)**下,在该模式下,传入的连接共享较少数量的线程来处理传入流量。
共享模式为 PRCP 的传入和传出两端分别引入了漏斗(因此也引入了队列)。
总结 三种高级连接模式对比
特性 | PRCP | 客户端池和 DRCP | 客户端池和 PRCP |
应用风格 | 需要应用代码显式调用 session get/release | 需要多线程编程 | 需要多线程编程 |
编程模型 | 任意 | 需要多线程编程 | 需要多线程客户端 |
优点 | 在数据库之外进行池化 | 允许多个应用程序使用会话池共享较少数量的数据库会话 | 允许多个应用程序使用会话池共享较少数量的数据库会话,并在数据库之外进行池化 |
缺点 | 额外的网络跳转 | 需要多线程编程;数据库资源用于池化 | 需要多线程客户端;额外的网络跳转 |
部署注意事项 | 单线程应用的 DRCP 替代方案 | 应用程序端会话池和 DRCP 或 PRCP 的结合,特别适用于具有大量应用服务器的微服务或类似配置 | 应用程序端会话池和 DRCP 或 PRCP 的结合,特别适用于具有大量应用服务器的微服务或类似配置 |
整理翻译至oracle官方文件,原文的如下链接
https://download.oracle.com/ocomdocs/global/Application_Programming_Using_Pooling.pdf