前文我们探讨了Oracle数据库中常用的四种链接方式,包括专用模式、会话池、DRCP和共享模式等。现在,让我们进一步深入探讨除了这四种常规链接模式外的三种高级模式。
将用户界面与数据库进行分离的应用编程风格带来的核心优势在于:多个用户能够共享少量的数据库会话资源。这种关系就如同一个容量有限的漏斗,我们可以定义一个“漏斗系数”来衡量用户数量与数据库中会话或进程数量的比例。
漏斗系数的实际大小是存在一定限制的。在现今多线程应用程序的环境中,每个应用程序进程都需要一定数量的最小会话来支持其会话池。当应用程序进程的数量增长到数万甚至更多时,这些最小会话的数量也可能急剧增加,从而存在过载数据库的风险。即便是设计良好的多线程应用程序,也需要采取额外的措施来保护数据库。
一种高效的方法是结合使用客户端池化技术与DRCP(Database Resource Connection Pooling)技术。如图6所示,通过这种结合,我们可以形成两个漏斗结构。
在这种模式下,虽然应用程序代码与之前的多线程代码相似,但客户端会话池(如Java中的UCP)却通过DRCP与数据库相连接。当工作线程需要获取会话时,将会发生以下两个步骤:
- 从进程自身的池中获取一个可用的会话。
- 通过DRCP代理(broker)将该会话与数据库中的实际会话进行关联。
这两个步骤都可能有等待队列,直到会话启动或变得可用。一旦会话被分配给工作线程,就不会产生额外的开销。由于存在两个漏斗,总漏斗系数可以更高,它是客户端漏斗系数与DRCP漏斗系数的乘积。
无论是仅使用客户端会话池还是单线程应用程序结合DRCP,工作线程都必须在完成数据库操作后立即释放会话。释放后的会话不应保留任何状态。
这种模式融合了客户端池化与DRCP的优点,进一步提高了数据库资源的利用效率,并降低了过载的风险。除了这两种技术,Oracle还提供了一种名为代理驻留连接池(PRCP)的技术。
图7展示了PRCP的工作原理,相较于图4中的DRCP模型,PRCP的池化工作发生在数据库服务器之外。在PRCP中,DRCP的代理进程(Broker)被替换为连接管理器中的多个线程和进程。在外向端,这些线程通过TCP/IP连接持有数据库会话。
与DRCP相似,客户端应用程序在运用PRCP时仍需将用户界面与数据库操作相分离,并需按需显式地获取和释放数据库会话。多线程客户端可以将其会话池连接到PRCP,这样就会有两个位置供工作线程排队以获取会话,形成两个漏斗,如图8所示。
值得注意的是,PRCP有两种运行模式:专用模式和共享模式。在专用模式下,每个传入连接都由一个专门的线程处理。而在共享模式下,传入的连接会共享较少数量的线程来处理流量。这两种模式分别为PRCP的传入和传出两端引入了漏斗和队列。
为了更全面的了解,建议查阅Oracle官方文档,详细资料可参考以下链接:
download./ocomdocs/global/Application_Programming_Using_Pooling.pdf