Oracle 11g DRCP配置与使用

Oracle 11g DRCP配置与使用
Oracle 11g推出了驻留连接池(Database Resident Connection Pool)特性,提供了数据库层面上的连接池管理机制,为应对高并发、短会话前端应用进行有益的尝试。

DRCP的配置很简单,本篇中让我们一起来配置一个11g环境上的DRCP,分析其工作特性。

1、Database Level Configuration

配置DRCP是分为两个步骤:database level configuration和application level configuration。首先在Database Server层面创建连接池对象。我们使用Oracle 11g进行试验。
SQL> select * from v$version;
BANNER
---------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
PL/SQL Release 11.2.0.1.0 - Production
CORE   11.2.0.1.0   Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0–Production

在默认情况下,Oracle 11g中是有一个默认的连接池对象。在视图dba_cpool_info中,可以看到连接池信息。
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
连接池sys_default_connection_pool就是默认连接池,状态是inactive。使用dbms_connection_pool包,可以方便的对其进行管理。
SQL> exec dbms_connection_pool.start_pool();
PL/SQL procedure successfully completed

使用start_pool方法,可以对默认池进行开启。注意:该方法还有参数pool_name,如果指定了名称,就可以创建出一个自定义的连接池,也可以同时管理多个连接池情况。如果不指定名称,就针对默认连接池进行管理。
Start_pool之后,dba_cpool_info视图中可以看到连接池状态。
SQL> select connection_pool, status from dba_cpool_info;
CONNECTION_POOL               STATUS              MINSIZE  
------------------------------ ---------------- ----------
SYS_DEFAULT_CONNECTION_POOL   ACTIVE                   4   
注意,此时没有连接,但是我们观察后台进程,发现新增加了连接池Server Process对象。
[[email protected] ~]$ ps -ef | grep ora_n
oracle   5800    1 1 05:07 ?       00:00:00ora_n000_wilson
oracle   5816 5584 0 05:07 pts/0   00:00:00 grep ora_n
[[email protected] ~]$ ps -ef | grep ora_l
oracle   5689    1 0 05:03 ?       00:00:00 ora_lgwr_wilson
oracle   5802    1 0 05:07 ?       00:00:00ora_l000_wilson
oracle   5804    1 0 05:07 ?       00:00:00ora_l001_wilson
oracle   5806    1 0 05:07 ?       00:00:00 ora_l002_wilson
oracle   5808    1 0 05:07 ?       00:00:00ora_l003_wilson
oracle   5818 5584 0 05:07 pts/0   00:00:00 grep ora_l
其中ora_n000进程是对应的Connection Broker对象,负责连接管理。Ora_lxxx进程就是连接池中的连接对象。当没有连接的时候,连接池维持minsize大小,与配置minsize=4相匹配。
下面进行application level configuration。
2、Application Level Configuration
在应用层面,可以从连接字符串或者本地服务名上进行配置。本篇主要从本地服务名上进行配置。
在tnsnames.ora中,我们可以进行本地命名配置。为了保证正确性,笔者倾向使用Oracle提供的netca工具来进行基础配置。
--开启X Windows Passive模式
[[email protected] ~]$ export DISPLAY=192.168.0.1:0.0
[[email protected] ~]$ netca
Oracle Net Services Configuration:
Default local naming configuration complete.
   Created net service name: wilsondrcp
Oracle Net Services configuration successful. The exit code is 0
之后,修改tnsname.ora文件的相关内容。
WILSONDRCP=
 (DESCRIPTION =
   (ADDRESS_LIST =
     (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.88)(PORT = 1521))
   )
   (CONNECT_DATA =
     (SERVER = POOLED) --新增加到其中,表明连接使用连接池;
     (SERVICE_NAME = wilson)

)

)
可以使用tnsping方法进行验证。
[[email protected] ~]$ tnspingwilsondrcp
TNS Ping Utility for Linux: Version 11.2.0.1.0 - Production on 01-MAR-2012 05:10:46
Copyright (c) 1997, 2009, Oracle. All rights reserved.
Used parameter files:
/u01/oracle/network/admin/sqlnet.ora
Used TNSNAMES adapter to resolve the alias
Attempting
to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL =
TCP)(HOST = 192.168.0.88)(PORT = 1521))) (CONNECT_DATA =(SERVER =
POOLED)(SERVICE_NAME = wilson)))
OK (0 msec)
配置了wilsondrcp名称之后,就可以使用sqlplus等工具进行连接。
[[email protected] ~]$ sqlplus /nolog
SQL*Plus: Release 11.2.0.1.0 Production on Thu Mar 1 05:11:47 2012
Copyright (c) 1982, 2009, Oracle. All rights reserved.
SQL> conn scott/[email protected]
Connected.
SQL> select sid from v$mystat where rownum<2;
      SID
----------
      146
此时,会话(sid=146)已经连接。此时,我们可以查看后台进程情况。
--标记LOCAL的本地连接进程不存在;
[[email protected] ~]$ ps -ef | grep LOCAL
oracle   5963 5931 0 05:14 pts/1   00:00:00 grep LOCAL
那么,我们连接的会话进程究竟是哪一个呢?
SQL> select paddr from v$session where sid=146;
PADDR
--------
38BCD994
SQL> select pid, spid from v$process where addr=‘38BCD994‘;
      PID SPID
---------- ------------------------
       315806–OS Level的进程编号;
[[email protected] ~]$ ps -ef | grep 5806
oracle   5806    1 0 05:07 ?       00:00:00 ora_l002_wilson
oracle   5975 5931 0 05:15 pts/1   00:00:00 grep 5806
对应的ora_l002_wilson进程就是我们刚刚看到的连接池进程。说明:我们使用sqlplus连接使用的连接池对象是通过DRCP。
在sqlplus退出之后,l002进程依然存在,只是被释放回连接池。
SQL> quit
Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
[[email protected] ~]$ ps -ef | grep 5806
oracle   5806    1 0 05:07 ?       00:00:00 ora_l002_wilson
oracle   5981 5931 0 05:15 pts/1   00:00:00 grep 5806
[[email protected] ~]$
3、连接池关闭
DRCP连接池是可以关闭的,同样使用dbms_connection_pool的stop_pool方法。
--关闭connection pool
SQL> exec dbms_connection_pool.stop_pool;
PL/SQL procedure successfully completed
[[email protected] ~]$ ps -ef | grep ora_n
oracle   5800    1 0 05:07 ?       00:00:00 ora_n000_wilson
oracle   6008 5931 0 05:18 pts/1   00:00:00 grep ora_n
[[email protected] ~]$ ps -ef | grep ora_l
oracle   5689    1 0 05:03 ?       00:00:00 ora_lgwr_wilson
oracle   6010 5931 0 05:18 pts/1   00:00:00 grep ora_l
关闭连接池后,连接池中连接lxxx立即被销毁释放。Connection Broker进程暂时存在。但是,过一会之后,该进程消失。
[[email protected] ~]$ ps -ef | grep ora_n
oracle   6027 5931 0 05:22 pts/1   00:00:00 grep ora_n
4、配置DRCP关键参数
在dba_cpool_info视图中,我们可以查看到相应的参数信息。
SQL> desc dba_cpool_info;
Name                  Type         Nullable Default Comments                                                   
---------------------- ------------- -------- ------- -----------------------------------------------------------
CONNECTION_POOL       VARCHAR2(128) Y               Connection pool name                                       
STATUS                VARCHAR2(16) Y               connection pool status                                     
MINSIZE               NUMBER       Y       Minimum number of connections                              
MAXSIZE               NUMBER       Y        Maximum number of connections                              
INCRSIZE              NUMBER       Y      Increment number of connections                            
SESSION_CACHED_CURSORS NUMBER       Y               Session cached cursors                                     
INACTIVITY_TIMEOUT    NUMBER       Y               Timeout for an idle session                                
MAX_THINK_TIME        NUMBER   Y    Max time for client to start activity on an acquired session
MAX_USE_SESSION       NUMBER       Y   Maximum life of a session based on usage                   
MAX_LIFETIME_SESSION  NUMBER       Y    Maximum life of a session based on time                    
NUM_CBROK             NUMBER       Y                                                                           
MAXCONN_CBROK         NUMBER       Y                                                                           
在DRCP连接池中,最常用的几个参数是minsize、maxsize和inactivity_timeout。
Minsize是说明DRCP连接池初始连接进程数量,如果请求数量超过这个minsize值,就会进行自动拓展。每次进行拓展的进程个数是incrsize参数。
Maxsize表示DRCP最大的拓展进程数量。当已经达到这个数量之后,DRCP连接池就不会获取到连接,被hange住。
DRCP对应的应用需求是“短会话、高并发”的应用场景。所以DRCP服务的连接必然是短时间交互。Inactivity_timeout参数就是设置这个timeout值。如果会话连接到这个连接之后,超过一定时间没有inactive交互,Oracle会自动将其断开。Server
Process被释放回连接池。
配置connection pool,我们可以使用dbms_connection_pool方法configure_pool。
SQL> exec dbms_connection_pool.configure_pool(minsize => 1,maxsize =>3,incrsize => 1,inactivity_timeout =>60);
PL/SQL procedure successfully completed
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        1         3                60
--启动连接池;
SQL> exec dbms_connection_pool.start_pool;
PL/SQL procedure successfully completed
--后台进程情况;
[[email protected] ~]$ ps -ef | grep ora_n
oracle   6035    1 3 05:22 ?       00:00:00 ora_n000_wilson
oracle   6039 5931 0 05:23 pts/1   00:00:00 grep ora_n
[[email protected] ~]$ ps -ef | grep ora_l
oracle   5689    1 0 05:02 ?       00:00:00 ora_lgwr_wilson
oracle   6037    1 0 05:22 ?       00:00:00 ora_l000_wilson
oracle   6041 5931 0 05:23 pts/1   00:00:00 grep ora_l
5、maxsize值突破实验
我们实验一下,当突破maxsize值的时候,会出现什么现象。我们启用sqlplus连接。
--第一会话
SQL> conn scott/[email protected]
Connected.
SQL> set time on;
05:23:45 SQL> select sid from v$mystat where rownum<2;
      SID
----------
       14

--第二会话
SQL> conn scott/[email protected]
Connected.
SQL> set time on
05:24:26 SQL> select sid from v$mystat where rownum<2;
      SID
----------
       22
启动了两个连接,此时连接池进程情况如下:
[[email protected] ~]$ ps -ef | grep ora_l
oracle   5689    1 0 05:03 ?       00:00:00 ora_lgwr_wilson
oracle   6037    1 0 05:22 ?       00:00:00 ora_l000_wilson
oracle   6052    1 0 05:23 ?       00:00:00 ora_l001_wilson
oracle   6054    1 0 05:23 ?       00:00:00 ora_l002_wilson
oracle   6118 5931 0 05:24 pts/1   00:00:00 grep ora_l
拓展到三个连接进程。但是,此时如果我们进行第三个连接连入,就不允许了。
SQL*Plus: Release 11.2.0.1.0 Production on Thu Mar 1 05:25:16 2012
Copyright (c) 1982, 2009, Oracle. All rights reserved.
SQL> conn scott/[email protected]
(数据库连接动作hange住)
这里,我们需要注意一个细节:连接池中存在三个server process,但是为什么第三个连接不能连入。注意:在DRCP连接池中,Oracle是要保留一个连接作为身份权限验证等操作使用的。不能将其分配出去。Maxsize我们设置为3,所以自然没有连接。
第三个连接hange住一段时间后,自动连入。
Connected.
SQL> select sid from v$mystat where rownum<2;
      SID
----------
       14
第三个会话连入。此时第一个和第二个会话是被强制断开。
--第一会话
05:24:37 SQL> select sid from v$mystat where rownum<2;
select sid from v$mystat where rownum<2
*
ERROR at line 1:
ORA-03113: end-of-file on communication channel
Process ID: 6052
Session ID: 14 Serial number: 5
--第二会话
05:24:47 SQL> select sid from v$mystat where rownum<2;
select sid from v$mystat where rownum<2
*
ERROR at line 1:
ORA-03113: end-of-file on communication channel
Process ID: 6054
Session ID: 22 Serial number: 17

此时,后台进程状态有释放连接。

[[email protected] ~]$ ps -ef | grep ora_l
oracle   5689    1 0 05:03 ?       00:00:00 ora_lgwr_wilson
oracle   6037    1 0 05:22 ?       00:00:00 ora_l000_wilson
oracle   6052    1 0 05:23 ?       00:00:00 ora_l001_wilson
oracle   6202 5931 0 05:28 pts/1   00:00:00 grep ora_l
附带,dbms_connection_pool的restore_defaults方法,可以将设置值置回。
SQL> exec dbms_connection_pool.stop_pool;
PL/SQL procedure successfully completed
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                 1         3                60
SQL> exec dbms_connection_pool.restore_defaults;
PL/SQL procedure successfully completed
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
6、结论
DRCP是Oracle
11g中的新特性。借助DRCP,一些高并发、短会话应用可以获得数据库层面的高效连接池。笔者猜测Shared
Server模式就是DRCP的一种早期雏形。在现代企业级应用系统中,连接池是中间件的一个重要组件。当一些应用,如PHP不能提供有效连接池的时候,DRCP也许是不错的选择。

时间: 2024-08-24 19:11:07

Oracle 11g DRCP配置与使用的相关文章

Oracle 11g监听器配置

Oracle 11g监听器配置 安装好oracle后,出现oracle监听器不能正确使用的问题,先后遇到问题: 1.Oracle ORA-12541:TNS:no listener 2.ORA-28547: connection to server failed, probable Oracle Net admin error 通过删除默认安装的监听,使用net manager重新配置新的监听,将原来监听位置的主机名由IP修改为机器名,终于解决问题.至于为什么会出现这种情况暂时未深入了解,对关于

Oracle 11g DRCP连接方式——基本原理

学习Oracle是一个复杂.繁琐的过程.在浩如烟海的Oracle官方资料.新特性.MOS资料和各种Internal知识面前,我们总是觉得力不从心.不知所措.但是,这往往也就是我们不断坚持.积累和追寻的乐趣. 在Oracle 11g中,提出了突破传统专用/共享连接的第三种连接方式——Database Resident Connection Pooling(DRCP).本篇我们一起来探讨这项技术. 1. 从Dedicated Server到Shared Server Client Process连接

oracle 11g dblink配置

关于DBLINK的概念在本文中不再赘述,本文主要介绍DBLINK的创建. 1.创建环境描述 本文将在两台操作系统为红帽5.5版本.装有Oracle 11g的虚拟机中进行DBLINK的创建以及测试工作. 2.主机配置 1)配置主机tnsname.ora文件 [[email protected] schema]$ cd /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/ [[email protected] admin]$ vi tnsnam

Oracle 11g Dataguard 配置,维护与详解 (ADG)

一.前言: 本手册主要记录如何配置,还介绍了配置原因,以及注意要点,已经主备切换,以及故障转移等重要操作步骤,我希望这个文章可以作为进行dataguard配置的一个参考手册. 二.前提 1.主库是归档模式: 如果我们不清楚为什么是归档模式,那我们就应该也不会清楚dataguard是用来做什么的.透过很多修饰的官方语言,我们需要明确DG(dataguard简称,后同)实际上的作用就是用来高可用.而实现原理就是从主库获取数据到从库,在主库发生异常的时候,从库接管主库,完成身份的变化.可以一个主库,最

oracle 11g 安装配置EM

不能登录EM,执行emca -config dbcontrol db 不知道总是默认1522的端口号,无奈,google一番,从下面第二步开始执行...(我的监听没问题) 1.打开oracle配置工具里的Net Configuration Assistant,选择"监听程序配置",下一步,接着选择"重新配置",下一步,仔细看下每一步配置的参数是否正确就OK了. 2.在命令行上使用"emca -deconfig dbcontrol db"命令删除配

ORACLE 11g dblink 配置升级

1.如果需要创建全局 DBLink,则需要先确定用户有创建 dblink 的权限: select * from user_sys_privs where privilege like upper('%DATABASE LINK%'); 如果没有,则需要使用 sysdba 角色给用户赋权: grant create public database link to dbusername; 2.使用该用户登录 PL/SQL,使用命令: -- 第一种方法:要求数据库服务器 A 上 tnsnames.or

Oracle 11g RAC搭建(VMware环境)

Oracle 11g RAC搭建(VMware环境) Oracle 11g RAC搭建VMware环境 安装环境与网络规划 安装环境 网络规划 环境配置 通过SecureCRT建立命令行连接 关闭防火墙 创建必要的用户组和目录并授权 节点配置检查 系统文件设置 配置IP和hostshostname 配置grid和oracle用户环境变量 配置oracle用户ssh互信 配置裸盘 配置grid用户ssh互信 挂载安装软件文件夹 安装用于Linux的cvuqdisk 手动运行cvu使用验证程序验证O

安装Oracle 11g RAC R2 之Linux DNS 配置

Oracle 11g RAC 集群中引入了SCAN(Single Client Access Name)的概念,也就是指集群的单客户端访问名称.SCAN 这个特性为客户端提供了单一的主机名,用于访问集群中运行的 Oracle 数据库.如果您在集群中添加或删除节点,使用 SCAN 的客户端无需更改自己的 TNS 配置.无论集群包含哪些节点,SCAN 资源及其关联的 IP 地址提供了一个稳定的名称供客户端进行连接使用.在Oracle 11g grid 安装时即要求为该特性配置DNS解析方式或GNS解

Oracle 11g 客户端的安装和配置。

原文:Oracle 11g 客户端的安装和配置. 数据库和客户端在不同的机器之上. 在安装之前,在安装Oracle数据库的服务器上导航到下面的目录. 将listener.ora和tnsnames.ora中的host中的localhost都改为机器的IP地址,我的为192.168.1.102 而后开始安装Oracle客户端 选择定制,可以自己定义安装的组件. 取消对Oracle Scheduler Agent组件的选择. 进行到80%的时候,会运行下面的配置程序.(一般隐藏在当前界面之后,不要在当