公司内部出现了一个简单的问题:“什么是连接池?为什么需要它?”
彡(゚)(゚)
一、必备知识1:Oracle数据库流程架构
Oracle 数据库具有适用于 UNIX/Linux 平台的多进程架构。
Oracle 数据库 数据库概述 19c
15 流程架构
https://docs.oracle.com/cd/F19136_01/cncpt/process-architecture.html#GUID-85D9852E-5BF1-4AC0-9E5A-49F0570DBD7A
进程执行的架构由操作系统决定。
例如,在 Windows 上,Oracle 后台进程是进程内的执行线程。
Linux 和 UNIX 上的 Oracle 进程要么是操作系统进程,要么是操作系统进程中的线程。Oracle 数据库在连接到数据库时会创建一个服务器进程。通过在服务器进程和客户端(发出 SQL 的应用程序)之间交换 SQL 来执行各种进程。
2.必备知识2:Oracle数据库监听器的连接处理及其问题
在大多数情况下,Oracle 数据库向侦听器发出连接请求并创建一个服务器进程。
Oracle 数据库如何创建服务器进程
https://docs.oracle.com/cd/F19136_01/cncpt/process-architecture.html#GUID-13FE4098-61DF-4D76-882D-551A88E0EBB8
当连接不使用 Bequeath 时,数据库创建服务器进程如下:
- 客户端应用程序向侦听器或代理请求新连接。
- 侦听器或代理将开始创建新进程或线程。
- 操作系统将创建一个新进程或线程。
- Oracle 数据库初始化各种组件和通知。
- 数据库传递连接和特定于连接的代码。
这个连接过程是一个负载非常重的过程,如果你尝试每秒处理数千条 SQL,这个连接过程就会成为瓶颈,性能(吞吐量)变得难以扩展。这就是为什么立即需要连接池的原因。
3.什么是连接池?
连接池是一种在应用程序端(客户端)预先保护一定数量的数据库连接并在应用程序中重用它们的机制。数据库连接是预先执行和存储(池化)的,连接由应用程序共享,以避免高连接负载。你能找到下面的链接吗?
连接池
https://e-words.jp/w/%E3%82%B3%E3%83%8D%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%97%E3%83%BC%E3%83%AA%E3%83%B3%E3%82%B0.html
当外部程序读取或写入数据库的内容时,它会向 DBMS 请求处理,但为此需要建立连接以发送和接收数据。每个连接和断开过程都会产生一定的负载,这种开销会降低经常访问的系统的性能。可以自己实现连接池机制,但是例如在Java中使用应用服务器(Oracle WebLogic Server、Tomcat、IBM WebSphere等)时,连接池机制是在应用服务器端实现的。因此,很可能会使用这种机制。
下面是 JDBC 数据源的手册,这就是 WebLogic 的连接池的工作原理。WebLogic Server JDBC 数据源的类型
https://docs.oracle.com/cd/F32751_01/weblogic-server/14.1.1.0/jdbca/jdbc_datasources.html#GUID-D030B12E-DE55-46DA-90B5-E17CB54F9A71近年来,由于容器技术的兴起,出现了应用端很难保持连接的情况。这是因为假设容器会重复容器自身的创建和销毁,而在容器销毁的时机,DB连接会丢失。无服务器处理(如 OCI Functions 和 AWS Lambda)可能会出现类似问题。此外,根据您使用的语言或框架,可能没有连接池机制。
在这种情况下,数据存储可以提供与连接池等效的机制。对于 Oracle 数据库,数据库驻留连接池 (DRCP) 对应于数据存储端的连接池。数据库驻留连接池 (DRCP)
https://docs.oracle.com/cd/F19136_01/cncpt/application-and-networking-architecture.html#GUID-531EEE8A-B00A-4C03-A2ED-D45D92B3F797将数据库驻留连接池 (DRCP) 与自治数据库一起使用
https://docs.oracle.com/cd//E83857_01/paas/autonomous-database/adbsa/connect-drcp.html亚马逊 RDS 代理
https://aws.amazon.com/jp/rds/proxy/4.连接池引起的问题及变通方法
连接池引起的一个问题是死连接。如果服务器进程端出现问题(进程崩溃、实例宕机等),则从客户端到服务器进程执行 SQL 会挂起(连接无效)。
为了避免死连接问题,许多应用程序服务器(例如 WebLogic)具有检查连接池健全性的机制。以下是WebLogic对应功能的使用手册。WebLogic:定期连接测试
https://docs.oracle.com/cd/F32751_01/weblogic-server/14.1.1.0/jdbca/ds_tuning.html#GUID-E379C967-EFEC-444A-9F4F-C822E933A33FOracle 数据库有一种称为 FAN/FCF 的机制。通知应用服务器端(WebLogic等)实例宕机(FAN)等事件,丢弃应用服务器端的无效连接,重新连接(FCF)。由于它通过数据存储端的事件通知进行操作,因此比轮询型 SQL 定期执行更容易避免问题并提高可用性。
Oracle 数据库功能概述(第 199 页,快速应用程序通知,快速应用程序通知:FAN)
https://speakerdeck.com/oracle4engineer/oracle-database-ji-neng-gai-yao?slide=199五、总结
连接到数据库/数据存储时,可以使用连接池来避免高负载。
充分利用连接池。
彡(^)(^)附录1. 关于Oracle WebLogic Server 连接池(JDBC 数据源)
WebLogic 中有多种类型的连接池(JDBC 数据源),它是 Oracle 制作的 Java 应用服务器。
对那些数据源的粗略评论彡(゚)(゚)
4 使用默认数据源(通用数据源)
https://docs.oracle.com/cd/F32751_01/weblogic-server/14.1.1.0/jdbca/default_datasource.html#GUID-EE3DAF88-3D79-4271-803E-A288ECEE211D默认数据源(通用数据源)是符合 Java EE 7 运行时的 JDBC 连接池。为 JDBC 连接池提供标准功能。
JDBC 多数据源是多个通用数据源的分组/抽象。事实上的 Oracle RAC-only 是因为它的特性?是这个意思吗?
创建与 1vs1 中的 Oracle RAC DB 节点(实例)对应的 DB 节点(实例)数量一样多的通用数据源,然后将这些通用数据源分组到一个多数据源中。当某个 Oracle RAC 数据库节点或实例发生故障时,该数据库节点(实例)对应的通用数据源将被禁用,SQL 执行将与其他通用数据源(数据库节点)保持平衡。
使用多个数据源从应用程序端隐藏数据库故障,从而提高可用性。
6 使用活动的 GridLink 数据源
https://docs.oracle.com/cd/F32751_01/weblogic-server/14.1.1.0/jdbca/gridlink_datasources.html#GUID-82D615E4-857E-4DC1-89D2-34270809690AActive GridLink 与 Oracle RAC 和 Active Data Guard 高度集成,例如上面提到的 FAN(Fast Application Notification)/FCF(Fast Connection Failover)和 RCLB(Runtime Connection Load Balancing),以及 Application Continuity(如下所述)。 JDBC 数据源具备这样做的能力,主要得益于高可用性。需要 WebLogic Suite 许可证才能使用。
7 使用通用连接池 (UCP) 数据源
https://docs.oracle.com/cd/F32751_01/weblogic-server/14.1.1.0/jdbca/ucp_datasources.html#GUID-91994E4A-5B7B-42A1-9584-9E1AB579FD40通用连接池开发者指南
https://docs.oracle.com/cd/F19136_01/jjucp/index.htmlUCP数据源是可以使用Oracle(独立于WebLogic)提供的UCP(Universal Connection Pool)功能的数据源。虽然比上面提到的 Active GridLink 有更多的限制,但可以使用下面的 FAN/FCF 和 Application Continuity,从而提高可用性。
启用应用程序连续性的客户端
https://speakerdeck.com/oracle4engineer/apurikesiyonkonteiniyuitei?slide=33附录2. 关于应用程序连续性
应用程序连续性是一种在 Oracle 数据库中从错误点发生错误时重新执行正在进行的事务的功能。事务重放对客户端隐藏错误,从而提高可用性。
应用连续性
https://speakerdeck.com/oracle4engineer/apurikesiyonkonteiniyuitei尝试使用 Java 的 UCP (ucp.jar) 和自治数据库的 ATP 实现应用程序连续性。 (甲骨文云基础设施)
https://qiita.com/ora_gonsuke777/items/5e348a4f444b2d3643d0由于它是独立于连接池的功能,因此包含在附录中,但可以通过与 FAN/FCF 等一起使用来提高可用性。
原创声明:本文系作者授权爱码网发表,未经许可,不得转载;
原文地址:https://www.likecs.com/show-308623999.html