11.2.0.4单实例DRCP(Database Resident Connection Pooling)简单测试

DRCP配置及测试

一. DRCP介绍

数据库提供会话进程在数据库中使用资源的方式:

1)Dedicated Server,一个会话在数据库中对应一个专有进程,一对一服务(资源数据库占用过多,一般使用中间件应用层面进行会话数量管控及会话资源重用)

当接收到Client Server的请求之后,Dispatcher会将请求放置在一个common队列中。可用的Server Process就从队列中获取请求信息。当终止会话之后,对应的会话信息就被释放掉。Session信息是从SGA中分配出。

2)Shared Server,数据库中配置连接池,会话循环使用这些连接池的资源(bug 太多几乎无人使用)

当Client Server请求之后,Connection Broker从连接池中寻找一个空闲Pooled Server提供给Client Server。如果没有空闲的,Connection Broker就会创建出一个新的连接。如果当前连接池已经达到最大数量限制,就将请求放置在等待队列中,等待空闲Server。

创建回收分配资源,消耗大

3)Database Resident Connection Pooling

Shared server在一定程度上缓解了Server process IDEL和频繁创建销毁Server process的问题。但是,Shared Server没有解决Session数据共享的问题。当存在client需要长时间持有session,同时其他client没有大量会话要求的时候,这种模型是有效的。但是,在每次请求会话的时间很短(短会话)和数据库活动需要多次会话交互的时候,DRCP就是更加理想的连接池模型了。

DRCP新特性主要针对的就是应用程序在访问数据库时,出现高并发连接数问题。DRCP连接池将Server和Session信息进行缓存,为多个访问的应用程序提供连接共享。

当Client Server请求之后,Connection Broker从连接池中寻找一个空闲Pooled Server提供给Client Server。如果没有空闲的,Connection Broker就会创建出一个新的连接。如果当前连接池已经达到最大数量限制,就将请求放置在等待队列中,等待空闲Server。

当释放Pooled Server回到Connection Pool的时候,相应的数据库资源被释放掉。DRCP的内存要求与存储池大小和会话有关。每个Pooled Server有一个Session信息,且存储在PGA中。

从功能上说,Shared Server 几乎早已无人使用,对于会话的资源重用,限制由中间键承担,及时DRCP优化了Shared server,本质上说还是没有中间件控制更成熟,应用更广泛。

二. DRCP配置使用

1.  版本

测试环境11.2.0.4 linux5.6 单实例环境

SQL> select * from v$version where banner like ‘%Database%‘;

BANNER

--------------------------------------------------------------------------------

Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

2.  连接池状态

查询数据库连接池状态,inactive未启用

SQL> select connection_pool, status, minsize, maxsize, INACTIVITY_TIMEOUT from dba_cpool_info;

CONNECTION_POOL               STATUS  MINSIZE    MAXSIZE INACTIVITY_TIMEOUT

------------------------------------------------------ ------------------------

SYS_DEFAULT_CONNECTION_POOL   INACTIVE      4         40                300

开启后,连接池中最少存在4个连接

默认最大的连接池支持40个连接

非活跃会话将在300秒后资源被回收

3.  启用DRCP

调用存储过程,启用DRCP

SQL> exec dbms_connection_pool.start_pool();

PL/SQL procedure successfully completed.

查询数据库连接池状态,已启用

SQL> select CONNECTION_POOL,STATUS,MINSIZE,MAXSIZE from dba_cpool_info;

CONNECTION_POOL                          STATUS              MINSIZE    MAXSIZE

---------------------------------------- ---------------- ---------- ----------

SYS_DEFAULT_CONNECTION_POOL              ACTIVE                    4         40

4.  管理服务进程

查询共享池连接管理进程

[[email protected] ~]# ps -ef|grep ora_n |grep -v grep

oracle    2967     1  0 20:35 ?        00:00:00 ora_n000_t2

ora_n000_sid 就是Connection Broker进程,负责连接管理。

查询连接池中server process进程,数量由minsize决定

[[email protected] ~]# ps -ef|grep ora_l |grep -v grep

oracle    2971     1  0 20:35 ?        00:00:00 ora_l000_t2

oracle    2975     1  0 20:35 ?        00:00:00 ora_l001_t2

oracle    2979     1  0 20:35 ?        00:00:00 ora_l002_t2

oracle    2983     1  0 20:35 ?        00:00:00 ora_l003_t2

oracle   29981     1  0 02:56 ?        00:00:06 ora_lgwr_t2

5.  编辑tnsnames.ora,客户端配置

#默认专有服务器连接模式

T2 =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = t2)(PORT = 1521))

(CONNECT_DATA =

(SERVER = DEDICATED)

(SERVICE_NAME = t2)

)

)

#使用连接池模式

Test =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = t2)(PORT = 1521))

(CONNECT_DATA =

(SERVER = POOLED)

(SERVICE_NAME = t2)

)

)

6.  会话进程

测试远程连接

[[email protected] admin]$ sqlplus sys/[email protected] as sysdba

#专有模式进程,远程连接

[[email protected] ~]# ps -ef|grep LOCAL|grep -v grep

oracle    3081     1  0 20:39 ?        00:00:00 oraclet2 (LOCAL=NO)

#连接池连接

[[email protected] admin]$ sqlplus sys/[email protected] as sysdba

SQL> select pid,spid from v$process where addr=(select paddr from v$session where sid =(select distinct sid from v$mystat));

PID SPID

---------- ------------------------

36 2979

[[email protected] ~]# ps -ef|grep 2979|grep -v grep

oracle    2979     1  0 20:35 ?        00:00:00 ora_l002_t2

[[email protected] ~]$ sqlplus scott/[email protected]

SQL> select pid,spid from v$process where addr=(select paddr from v$session where sid =(select distinct sid from v$mystat));

PID SPID

---------- ------------------------

34 2975

[[email protected] ~]# ps -ef|grep 2975|grep -v grep

oracle    2975     1  0 20:35 ?        00:00:00 ora_l001_t2

7.  关闭连接池

关闭资源池—已连接会话不结束,无法关闭。主动关闭会话或者等待连接池机制会话inactive达到断开机制才关闭

SQL> exec dbms_connection_pool.stop_pool;

Tue Dec 25 20:07:51 2018

Closing scheduler window

Closing Resource Manager plan via scheduler window

Clearing Resource Manager plan via parameter

关闭后,进程消失

[[email protected] ~]# ps -ef|grep ora_l|grep -v grep|grep -v lgwr

8.  调整连接池

修改为初始1个连接,最大3个连接,默认60s断开,测试连接达到最大值如何报错

SQL> exec dbms_connection_pool.configure_pool(minsize => 1,maxsize =>3 ,inactivity_timeout =>60);

select connection_pool, status, minsize, maxsize, INACTIVITY_TIMEOUT from dba_cpool_info

CONNECTION_POOL                     STATUS              MINSIZE    MAXSIZE INACTIVITY_TIMEOUT

----------------------------------- ---------------- ---------- ---------- ------------------

SYS_DEFAULT_CONNECTION_POOL         INACTIVE                  1          3                 60

测试第三个会话连接,hang住

[[email protected] ~]$ sqlplus scott/[email protected]

--等待60s,存在会话被强制断开后,空闲新的连接,添加进入

SQL> select * from cat;

select * from cat

*

ERROR at line 1:

ORA-03113: end-of-file on communication channel

Process ID: 3442

Session ID: 65 Serial number: 67

使用连接池方式登录数据库,连接池未开启报错

ERROR:

ORA-12520: TNS:listener could not find available handler for requested type of server

三. 管理思路

1.尝试杀会话,对数据库是否存在影响

ps -ef|grep ora_l|grep -v grep|grep -v lgwr

oracle    3427     1  0 21:04 ?        00:00:00 ora_l000_t2

oracle    3446     1  0 21:04 ?        00:00:00 ora_l002_t2

[[email protected] ~]# kill -9 3427

[[email protected] ~]# kill -9 3446

暂时无异常

新的会话连接,不受影响

2尝试杀连接池代理进程,什么影响

[[email protected] ~]#  ps -ef|grep ora_n |grep -v grep

oracle    3423     1  0 21:04 ?        00:00:00 ora_n000_t2

杀死代理进程,所有新的会话无法连接,已成功连接会话不受影响

[[email protected] admin]$ sqlplus sys/[email protected] as sysdba

ERROR:

ORA-12537: TNS:connection closed

Enter user-name:

间隔1分钟内,进程自启动(具体时间未测试)

[[email protected] ~]#  ps -ef|grep ora_n |grep -v grep

oracle    3564     1  0 21:11 ?        00:00:00 ora_n000_t2

新的会话能正常连接

[[email protected] admin]$ sqlplus sys/[email protected] as sysdba

SQL>

[[email protected] ~]#  ps -ef|grep ora_l |grep -v grep|grep -v lgwr

oracle    3544     1  0 21:10 ?        00:00:00 ora_l000_t2

oracle    3584     1  0 21:12 ?        00:00:00 ora_l001_t2

小结:对于数据库来说,开启drcp,不会影响专用进程的连接,只是多出一种新的连接方式;

由于使用少,且不熟悉该技术,因此不建议使用。最成熟的方式,数据库使用专用服务器连接模式,中间件去管理连接池,而不是使用数据库内部自带的连接池(DRCP);

当然,如果强行使用,通过服务器端测试,杀死会话或者连接池分配进程,存在健壮性,不会影响整个库,但是需要做好应用报错连接的准备,通过mos提前进行相关预防。

四. 总结

不建议使用

从功能上说,DRCP本质是节约数据库资源的保护措施,与中间件功能重叠,且中间件应用管理更安全

原文地址:https://www.cnblogs.com/lvcha001/p/10223735.html

时间: 2024-11-07 21:53:25

11.2.0.4单实例DRCP(Database Resident Connection Pooling)简单测试的相关文章

Asianux 7.3安装Oracle 11.2.0.4单实例体验

环境:Asianux 7.3 需求:安装Oracle 11.2.0.4 单实例 背景:系统使用默认的最小安装部署,Oracle安装额外需要的包统一使用yum安装. 查看当前系统相关信息: [[email protected] ~]# uname -a Linux localhost.localdomain 3.10.0-514.axs7.x86_64 #1 SMP Fri Feb 17 19:31:50 CST 2017 x86_64 x86_64 x86_64 GNU/Linux [[emai

oracle database resident connection pooling(驻留连接池)

oracle在11g中引入了database resident connection pooling(DRCP).在此之前,我们可以使用dedicated 或者share 方式来链接数据库,dedicated方式是oracle数据库默认的链接方式,无需过多的配置,而且关于dedicated的bug也是非常少的,因此,通常情况下,建议使用dedicated方式来链接数据库.但是,在服务器资源有限,并且同时连接数据库的用户量非常大时,dedicated方式就无能为力了.假设并发用户为5000,每个d

oracle 11.2.0.4单实例文件系统安装与补丁

[TOC] 一,预安装处理 1.版本准备 操作系统:RHEL 6.5 数据库版本:Oracle 11.2.0.4 相关包:p13390677_112040_Linux-x86-64_1of7.zip              p13390677_112040_Linux-x86-64_2of7.zip              p21352635_112040_Linux-x86-64.zip              OPatch-p6880880_112000_Linux-x86-64.zi

?完整记录一则Oracle 11.2.0.4单实例打PSU补丁的过程

本文记录了打PSU的全过程,意在体会数据库打PSU补丁的整个过程. 1.OPatch替换为最新版本2.数据库软件应用19221551补丁程序3.数据库应用补丁4.验证PSU补丁是否应用成功 1.OPatch替换为最新版本 [[email protected] usr2]$ id uid=500(oracle) gid=500(oinstall) 组=500(oinstall),501(dba) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.

11.2.0.4 单实例的 db instance 启动的alert

Fri Jan 09 03:11:17 2015 DIAG started with pid=19, OS id=6031 Dumping diagnostic data in directory=[cdmp_20150109031118], requested by (instance=1, osid=2456 (CJQ0)), summary=[incident=45657]. Mon Feb 09 01:51:09 2015 Adjusting the default value of p

Java学习不走弯路教程(11 单例模式2(单实例类))

单例模式2(单实例类) 一. 前言 在前上一章教程中,介绍了静态方法的伪单例模式.本章将在上一章的基础上,进一步扩展程序. 注:1.本文针对初学Java的同学训练学习思路,请不要太纠结于细节问题.2.本文旨在达到抛砖引玉的效果,希望大家扩展本例子,以学到更多知识的精髓. 学习本章需要准备的知识:1.读完本系列教程的前面章节.2.理解单例模式. 二. 步入正题话不多说,大家自己理解,下面步入正题: 静态方法虽然能满足我们的需求,但他牺牲了面向对象对程序带来的扩展性,比如AOP等.本章我们讨论对单实

安装Mongodb3.0.6单实例

[[email protected] ~]#mkdir -p /export/data [[email protected] ~]#mkdir -p /export/log [[email protected] export]#tar -xvf mongodb-linux-x86_64-3.0.6.tgz [[email protected] export]#mv mongodb-linux-x86_64-3.0.6 mongodb [[email protected] log]#touch m

Oracle Study之--Oracle 单实例11.2.0.1.0升级到11.2.0.3.0

Oracle Study之--Oracle 单实例11.2.0.1.0升级到11.2.0.3.0 系统环境: 操作系统:RedHat EL6(64位) Oracle:    Oracle 11gR2 Oracle 11.2.0.1 单实例升级到11.2.0.3 Oracle 升级的步骤都差不多,先升级Oracle software,然后升级Oracle instance. Oracle 11.2.0.2的patchset No 是:10098816. 关于该Patchset 的下载地址,参考下面

Oracle 11g单实例RMAN恢复到Oracle 11g RAC

一.环境说明 操作系统版本: RHEL 6.5 x64 1. 源数据库服务器 Oracle版本: Oracle 11g 11.2.0.4 64位(单机)Oracle_SID: orcl db_name   : orcl 背景:一台生产oracle10g(10.2.0.5)数据库计划迁移到Oracle 11.2.0.4.0 RAC.1) 先oracle10g(10.2.0.5)升级到Oracle 11.2.0.4(过程略)2)再Oracle 11.2.0.4单实例迁移到Oracle 11.2.0.