上篇中,我们探讨了基本配置DRCP的方法和使用细节。本篇我们继续来探讨配置参数细节和各方面指标内容。
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
--后台进程情况;
[oracle@oracle11g ~]$ 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
[oracle@oracle11g ~]$ 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/tiger@wilsondrcp
Connected.
SQL> set time on;
05:23:45 SQL> select sid from v$mystat where rownum<2;
SID
----------
14
--第二会话
SQL> conn scott/tiger@wilsondrcp
Connected.
SQL> set time on
05:24:26 SQL> select sid from v$mystat where rownum<2;
SID
----------
22
启动了两个连接,此时连接池进程情况如下:
[oracle@oracle11g ~]$ 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/tiger@wilsondrcp
(数据库连接动作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
此时,后台进程状态有释放连接。
[oracle@oracle11g ~]$ 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也许是不错的选择。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/17203031/viewspace-717887/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/17203031/viewspace-717887/