zoukankan      html  css  js  c++  java
  • 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.  管理服务进程

    查询共享池连接管理进程

    [root@t2 ~]# 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决定

    [root@t2 ~]# 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.  会话进程

    测试远程连接

    [oracle@t2 admin]$ sqlplus sys/oracle@t2 as sysdba

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

    [root@t2 ~]# ps -ef|grep LOCAL|grep -v grep

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

    #连接池连接

    [oracle@t2 admin]$ sqlplus sys/oracle@test 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

    [root@t2 ~]# ps -ef|grep 2979|grep -v grep

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

     

    [oracle@t2 ~]$ sqlplus scott/tiger@test

    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

    [root@t2 ~]# 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

     

    关闭后,进程消失

    [root@t2 ~]# 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住

    [oracle@t2 ~]$ sqlplus scott/tiger@test

    --等待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

    [root@t2 ~]# kill -9 3427

    [root@t2 ~]# kill -9 3446

    暂时无异常

    新的会话连接,不受影响

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

    [root@t2 ~]#  ps -ef|grep ora_n |grep -v grep

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

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

    [oracle@t2 admin]$ sqlplus sys/oracle@test as sysdba

    ERROR:

    ORA-12537: TNS:connection closed

    Enter user-name:

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

    [root@t2 ~]#  ps -ef|grep ora_n |grep -v grep

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

     

    新的会话能正常连接

    [oracle@t2 admin]$ sqlplus sys/oracle@test as sysdba

    SQL>

    [root@t2 ~]#  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本质是节约数据库资源的保护措施,与中间件功能重叠,且中间件应用管理更安全

  • 相关阅读:
    VisualVM 分析full GC问题记录
    HTTPS协议、TLS协议、证书认证过程解析
    java.lang基础数据类型boolean、char、byte、short、int、long、float、double (JDK1.8)
    java.lang.StringBuilder和java.lang.StringBuffer (JDK1.8)
    MVC中自带的异步((Ajax.BeginForm)无效
    百度富文本编辑器UEDITOR
    只有在配置文件或 Page 指令中将 enableSessionState 设置为 true 时,才能使用会话状态。还请确保在应用程序配置的 // 节中包括 System.Web.SessionSta
    【知识碎片】CSS 篇
    js 将json字符串转换为json对象的方法解析
    【知识碎片】Asp.Net 篇
  • 原文地址:https://www.cnblogs.com/lvcha001/p/10223735.html
Copyright © 2011-2022 走看看