11G DRCP(Database Resident Connection Pooling)的一些问题

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博客 ” ,链接:http://blog.itpub.net/15415488/viewspace-541565/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/15415488/viewspace-541565/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值