DRCP (Database Resident Connection Pooling) 是11G的New feature,
网上讨论它的文章还不多,也有可能是我太过孤寡。。。
个人觉得它的思想还是挺成熟的,通过动态释放idle connections来达到多系统资源的重用,期望节省更多的资源,这样就可以支持更多的连接。
相信DBA肯定做过很多balance connections的事情,当系统负荷太重的时候,尤其当用MTS,large pool快满的时候我们就需要kill 一些idle的sessions。
现在,用DRCP,oracle的connection broker进程帮我们解决了这个问题。
oracle在white paper上写到
"In one of our test scenarios on a 2GB system,
DRCP was able to support 10 times the number of connections compared to shared
servers, and 20 times the number of connections compared to dedicated servers."
我自己也做过一个小实验,在redhat上,一个小型11G数据库:
For 1 session using dedicated server,its memory of PGA is about 600KB;
For 1 session using MTS ,its memory in the large pool of SGA is about 140KB;
For 1 session using DRCP,its memory in the PGA is about 130KB.
We can see that the difference between MTS and DRCP is little on the memory allocated.
So I think the benifit of DRCP is because it can callback the idle pooled servers quickly and
then re-allocate the pooled servers to newly created connections.
好啦,说了这么多,还是简单介绍下如何配置DRCP吧。
其实很简单,目前就一个package管理DRCP,那就是:DBMS_CONNECTION_POOL。
SQL> desc DBMS_CONNECTION_POOL
PROCEDURE ALTER_PARAM
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
POOL_NAME VARCHAR2 IN DEFAULT
PARAM_NAME VARCHAR2 IN
PARAM_VALUE VARCHAR2 IN
PROCEDURE CONFIGURE_POOL
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
POOL_NAME VARCHAR2 IN DEFAULT
MINSIZE BINARY_INTEGER IN DEFAULT
MAXSIZE BINARY_INTEGER IN DEFAULT
INCRSIZE BINARY_INTEGER IN DEFAULT
SESSION_CACHED_CURSORS BINARY_INTEGER IN DEFAULT
INACTIVITY_TIMEOUT BINARY_INTEGER IN DEFAULT
MAX_THINK_TIME BINARY_INTEGER IN DEFAULT
MAX_USE_SESSION BINARY_INTEGER IN DEFAULT
MAX_LIFETIME_SESSION BINARY_INTEGER IN DEFAULT
PROCEDURE RESTORE_DEFAULTS
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
POOL_NAME VARCHAR2 IN DEFAULT
PROCEDURE START_POOL
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
POOL_NAME VARCHAR2 IN DEFAULT
PROCEDURE STOP_POOL
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
POOL_NAME VARCHAR2 IN DEFAULT
首先第一步,是开启DRCP:
EXECUTE DBMS_CONNECTION_POOL.START_POOL('SYS_DEFAULT_CONNECTION_POOL');
目前11G版本支持一个pool name,就是“SYS_DEFAULT_CONNECTION_POOL”,所以写不写无所谓。
这样其实就已经可以了,当数据库重启时,如果之前已经start了DRCP,则启动后DRCP已经start了。
第二步,就是配置tnsnames.ora:
poolls=
(DESCRIPTION=
(SDU=8192)
(TDU=8192)
(ADDRESS=
(PROTOCOL=TCP)
(HOST=HaoRedHat)
(PORT=1521))
(CONNECT_DATA=(SID=hao)
(SERVICE_NAME= poolls)
(SERVER=pooled)))
记住最重要的是service=pooled是必须的。
第三部,sqlplus username/password@poolls
配置它很简单,接着就是自己需要根据自己系统的特性,配置个性化的DRCP,我们可以使用:
DBMS_CONNECTION_POOL.CONFIGURE_POOL (
pool_name IN VARCHAR2 DEFAULT 'SYS_DEFAULT_CONNECTION_POOL',
minsize IN NUMBER DEFAULT 4,
maxsize IN NUMBER DEFAULT 40,
incrsize IN NUMBER DEFAULT 2,
session_cached_cursors IN NUMBER DEFAULT 20,
inactivity_timeout IN NUMBER DEFAULT 300,
max_think_time IN NUMBER DEFAULT 120,
max_use_session IN NUMBER DEFAULT 500000,
max_lifetime_session IN NUMBER DEFAULT 86400);
DBMS_CONNECTION_POOL.ALTER_PARAM (
pool_name IN VARCHAR2 DEFAULT 'SYS_DEFAULT_CONNECTION_POOL',
param_name IN VARCHAR2,
param_value IN VARCHAR2);
这两个过程来实现。具体使用查手册就可以了。
有三个视图可以用来tunning DRCP:
DBA_CPOOL_INFO
V$CPOOL_STATS
V$CPOOL_CC_STATS
其中有两个很迷惑的问题我想问oracle:
1.maxsize 参数是用来设置一个pool最多能允许的pooled server数。但是我发现真正的maxsize其实是maxsize-1.
很容易证明这一点:
exec DBMS_CONNECTION_POOL.ALTER_PARAM ('','maxsize','3');
当我们已经有两个connections时,当你在试图建立一个新的connection时,第三个connection会等待前面两个之一被回收。
Doc 577865.1 on metalink已经说明了这个case。
2.incsize 参数是用来设置当pool里当前pooled server都被使用了,但还没到maxsize的大小时,又有新的connection进来,
pooled server一次增长的个数。但我发现真正的incsize其实是incsize+1.
也很容易证明这一点:
exec DBMS_CONNECTION_POOL.ALTER_PARAM ('','minsize','3');
exec DBMS_CONNECTION_POOL.ALTER_PARAM ('','maxsize','100');
exec DBMS_CONNECTION_POOL.ALTER_PARAM ('','incrsize','10');
当我连接第三个connections时,
通过select NUM_OPEN_SERVERS from V$CPOOL_STATS;
或者通过在操作系统层面 ps -ef|grep ora_l0|grep -v grep
都可以看出增长之后的pooled server变成了14个,增长了11个。
这两个mis-leading 的参数的例子都可以通过设定不通初始值reproduce出来,我已经发了SR问oracle了。
希望新的版本会改进这些mis-leading的参数。(虽然也没啥意义。。。)
最后还有一个最不解的问题关于DRCP:
我们有一个系统视图V$CPOOL_CC_STATS 来显示connection级别的信息,
另一个视图V$CPOOL_STATS 来显示pooled server总体的信息。
我每次建立连接都是通过同样的命令来实现,而且很明显pooled server也被重用了,
但是这两个视图都把所有connections记录为miss,居然一次hits都没有。。。
SQL> select NUM_REQUESTS,NUM_HITS,NUM_MISSES from V$CPOOL_STATS;
NUM_REQUESTS NUM_HITS NUM_MISSES
------------ ---------- ----------
46 0 46
SQL> select NUM_REQUESTS,NUM_HITS,NUM_MISSES from V$CPOOL_CC_STATS;
NUM_REQUESTS NUM_HITS NUM_MISSES
------------ ---------- ----------
40 0 40
6 0 6
十分诡异,如果前面那两个迷惑的问题算做是misleading的参数问题,那么这个应该能算作DRCP的一个小bug了吧。
如果有谁知道这以上三个问题是怎么回事,请不灵赐教!
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/15415488/viewspace-541565/ ,如需转载,请注明出处,否则将追究法律责任。