oracle在11g中引入了database resident connection pooling(DRCP)。在此之前,我们可以使用dedicated 或者share 方式来链接数据库,dedicated方式是oracle数据库默认的链接方式,无需过多的配置,而且关于dedicated的bug也是非常少的,因此,通常情况下,建议使用dedicated方式来链接数据库。但是,在服务器资源有限,并且同时连接数据库的用户量非常大时,dedicated方式就无能为力了。假设并发用户为5000,每个dedicated进程需要包含4m的内存,而每个sessioin占用的内存量为400k,那么我们总共需要21.43g的内存。这时我们可以采用share方式来连接数据库,假设共享服务进程数量为100,则总共需要2.29g的内存,其中2g的内存分配自sga。但是shared连接方式由于存在过多的bug,而且为了使用shared方式,需要进行某些配置工作,因此,并不是我们希望采用的数据库连接方式。

在web横行的今天,数据库技术也面临着的前所未有的挑战。熟悉web技术的人员都知道,web是一种无状态技术。用户请求网页,服务器处理用请求,连接数据库获取数据并进行处理,断开数据库连接,展现网页至用户,这是一般网页的处理流程,它具有数据库连接时间短、频繁连接数据库、并发量大的特点。此时,人们引入了连接池技术,但是这些技术多数是在客户端层面或者中间件层面实现的,具有如下缺陷“

1.连接池多是单个独立的节点,如果多个节点需要使用公用的数据库连接,往往需要在各个节点独自配置,这无疑会浪费数据库资源

2.连接池多数采用预分配的方式连接数据库,因此在用户压力不大的情况下,同样会持续保持数据库连接,进而浪费了数据库资源

除此之外,在某些多进程,单线程的环境(如php)下,使用连接池技术基本是不可能的。

DRCP的引入可以有效的解决这些问题,DRCP将session和服务器进程捆绑在一起进行缓存(pool server),用户请求连接数据库时,首先会连接到CONNECTION BROKER进程,broker进程根据连接信息从连接池中选择pool server,将其分配给请求用户,此后,用户直接和pool server通信,broker不再参与其中,直至用户断开连接,将pool server归还给连接池。

同样假设并发用户数量为5000,pool server为100,DRCP所需内存为100 X (400 KB + 4 MB) + (5000 X 35KB)= 609.9 MB,其中(5000*35k)为broker内存,如图:

在11g中,已经预先安装了DRCP,但默认情况下,并没有启用。启用DRCP需要运行如下过程:

exec dbms_connection_pool.start_pool;

通过DBA_CPOOL_INFO视图可以查看DRCP的启用状态。

SQL> select connection_pool,status from dba_cpool_info;

CONNECTION_POOL 	       STATUS
------------------------------ ------------------------------------------------
SYS_DEFAULT_CONNECTION_POOL INACTIVE SQL> exec dbms_connection_pool.start_pool; PL/SQL 过程已成功完成。 SQL> select connection_pool,status from dba_cpool_info; CONNECTION_POOL STATUS
------------------------------ ------------------------------------------------
SYS_DEFAULT_CONNECTION_POOL ACTIVE

为了使用DRCP,我们需要在客户端进行一些配置,如果客户端使用的是tnsname.ora 文件,我们需要将(server=POOLED)添加到CONNECT_DATA段中,如:

ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = ROBERTSDELLXPS)(PORT = 1521))
(CONNECT_DATA =
(SERVER = POOLED)
(SERVICE_NAME = orcl)
)
)

如果采用EASYCONNECTION方式连接数据库,则需要保证连接字符串为如下格式:

sqlplus scott/tiger@easy:1521/orcl:pooled

适用场景

  • 内存资源有限情况下,需要支持大量用户连接

  • 客户端用户具有相似性,并可重用或者共享session。(相似性:以相同的数据库凭证登录数据库,并且使用相同的用户schema)

  • 用户连接具有短暂性.

  • 不存在跨客户端session.

  • 客户端是多进程或者多主机.

RDCP的限制

如果在链接池中有活动的用户,则如下操作是无法完成的

  • 关闭数据库(数据库hang住,直至所有的pool session结束)

  • 停止RCDP (当前执行stop_pool的session hang住)

  • 更改pool session的用户密码(本人测试是可以修改的,不知是我测试的有问题还是官方文档错误,有知道的高手,请赐教

  • Use shared database links to connect to a database resident connection pool

  • 使用高级安全选项,如加密等

  • 利用OCI_MIGRATE或者 OCIConnectionPool实现可迁移的session

DDL statements that pertain to database users in the pool need to be performed carefully, as the pre-DDL sessions in the pool can still be given to clients post-DDL. For example, while dropping users, ensure that there are no sessions of that user in the pool and no connections to the Broker that were authenticated as that user.

        Sessions with explicit roles enabled, that are released to the pool, can be later handed out to connections (of the same user) that need the default logon role. Avoid releasing sessions with explicit roles, and instead terminate them


Connection Classes

        默认情况下,DRCP会保证不同用户之间是不可以共享连接的。这种保证是通过CONNECTION CLASSES来实现的,每个连接对应一个connection classes,只有cc相同的连接才可以共享,默认情况下,cc为“usernmae.shared”例如“EASY.SHARED”。除此之外,我们也可以通过客户端的连接请求,来手工指定connection classes ,从而达到相同的用户连接之间的细粒度划分。

SESSION PURITY

        通过在客户端指定PURITY参数,可以影响客户端请求连接时的行为,如果purity=new,则连接池会新建练级,如果purigy=self,则会重用已有连接。

有个PURITY 和connection classes在oci部分由比较详细的描述。如下是JDBC设置CONNECTION CALSSES 的示例:

String url = "jdbc:oracle:thin:@//localhost:5521/orcl:POOLED";
PoolDataSource pds = PoolDataSourceFactory.getPoolDataSource();
pds.setConnectionFactoryClassName("oracle.jdbc.pool.OracleDataSource");
// Set DataSource Property
pds.setUser("HR");
pds.setPassword("hr");
System.out.println ("Connecting to " + url);
pds.setURL(url);
pds.setConnectionPoolName("HR-Pool1");
pds.setMinPoolSize(2);
pds.setMaxPoolSize(3);
pds.setInitialPoolSize(2);
Properties prop = new Properties();
prop.put("oracle.jdbc.DRCPConnectionClass", "HR-Pool1");
pds.setConnectionProperties(prop);

相关PLSQL包

我们可以通过如下PLSQL包来管理DRCP:

SQL> desc dbms_connection_pool
PROCEDURE ALTER_PARAM
参数名称 类型 输入/输出默认值?
------------------------------ ----------------------- ------ --------
POOL_NAME VARCHAR2 IN DEFAULT
PARAM_NAME VARCHAR2 IN
PARAM_VALUE VARCHAR2 IN
PROCEDURE CONFIGURE_POOL
参数名称 类型 输入/输出默认值?
------------------------------ ----------------------- ------ --------
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
参数名称 类型 输入/输出默认值?
------------------------------ ----------------------- ------ --------
POOL_NAME VARCHAR2 IN DEFAULT
PROCEDURE START_POOL
参数名称 类型 输入/输出默认值?
------------------------------ ----------------------- ------ --------
POOL_NAME VARCHAR2 IN DEFAULT
PROCEDURE STOP_POOL
参数名称 类型 输入/输出默认值?
------------------------------ ----------------------- ------ --------
POOL_NAME VARCHAR2 IN DEFAULT

相关视图

DBA_CPOOL_INFO

提供与连接池相关的信息,如状态(活动,非活动)和各种属性(最小值,最大值等)

SQL> SELECT connection_pool, status, maxsize FROM dba_cpool_info;

CONNECTION_POOL                STATUS              MAXSIZE
------------------------------ ---------------- ----------
SYS_DEFAULT_CONNECTION_POOL INACTIVE 40

V$CPOOL_STATS

提供有关连接池的统计信息

SQL> SELECT pool_name, num_requests, num_hits, num_misses
2* FROM v$cpool_stats; POOL_NAME NUM_REQUESTS NUM_HITS NUM_MISSES
---------------------------- ------------ ---------- ----------
SYS_DEFAULT_CONNECTION_POOL 1 0 1

V$CPOOL_CC_INFO

提供连接池与连接类别(connection class)之间的对应关系

SQL> SELECT * FROM v$cpool_cc_info;

POOL_NAME                    CCLASS_NAME
---------------------------- --------------
SYS_DEFAULT_CONNECTION_POOL SCOTT.SHARED

V$CPOOL_CC_STATS

提供连接类别(connection class)的统计信息

SQL> SELECT cclass_name, num_requests, num_hits, num_misses
2* FROM v$cpool_cc_stats; CCLASS_NAME NUM_REQUESTS NUM_HITS NUM_MISSES
-------------------- ------------ ---------- ----------
SCOTT.SHARED 1 0 1

DRCP相关进程


oracle database resident connection pooling(驻留连接池)的更多相关文章

  1. 11.2.0.4单实例DRCP(Database Resident Connection Pooling)简单测试

    DRCP配置及测试 一. DRCP介绍 数据库提供会话进程在数据库中使用资源的方式: 1)Dedicated Server,一个会话在数据库中对应一个专有进程,一对一服务(资源数据库占用过多,一般使用 ...

  2. DataSource接口 Connection pooling(连接池

    一.DataSource接口是一个更好的连接数据源的方法:  JDBC1.0是原来是用DriverManager类来产生一个对数据源的连接.JDBC2.0用一种替代的方法,使用DataSource的实 ...

  3. [SQLite3]connection string的连接池参数引发的错误

    最近在.net中使用Sqlite数据库,发现.net的驱动做得不错,而且实现了加密功能.于是想给自己的数据库加上口令,结果,多次实验都以失败告终: 链接数据库,然后ChangePassword都成功执 ...

  4. [转].Net连接池超时注意事项

    http://blog.csdn.net/jxqvip/article/details/6738551 超时时间已到.超时时间已到,但是尚未从池中获取连接.出现这种情况可能是因为所有池连接均在使用,并 ...

  5. Spring boot中配置HikariCP连接池

    # jdbc_config datasourcespring.datasource.driver-class-name=com.mysql.cj.jdbc.Driverspring.datasourc ...

  6. Oracle ODP.NET连接池

    数据库连接池 连接池是数据库连接的缓存,每当应用程序需要连接数据库时向连接池申请数据库连接,连接池负责具体数据库连接的创建和销毁.连接池中的数据库连接会缓存一段时间,后续的连接请求首先使用缓存中的数据 ...

  7. 结合使用 Oracle Database 11g 和 Python

    结合使用 Oracle Database 11g 和 Python 本教程介绍如何结合使用 Python 和 Oracle Database 11g. 所需时间 大约 1 个小时 概述 Python ...

  8. Sql Server 连接池及其用法

    其实我们一直在使用SqlServer的连接池.在连接字符串中,Pooling为是否启用连接池,默认值为true,表示启用. 与连接池相关的两个重要参数是 Min Pool Size和 Max Pool ...

  9. 《深入理解mybatis原理》 Mybatis数据源与连接池

    对于ORM框架而言,数据源的组织是一个非常重要的一部分,这直接影响到框架的性能问题.本文将通过对MyBatis框架的数据源结构进行详尽的分析,并且深入解析MyBatis的连接池. 本文首先会讲述MyB ...

随机推荐

  1. SQL Server2008数据库自动备份步骤

    一,  在电脑开始菜单中选择“SQL Server Management Studio”双击.在出现的界面中点击“连接”按钮. 二,  在出现的“ Microsoft SQL Server Manag ...

  2. sql server 2008如何保存Emoji表情

    1.将就的方法已找到,在保存前,Emoji表情字符串进行utf-8编码,然后写入数据表的nvarchar(max)字段,取出时再进行解码即可. c#的写法如下: 写入数据表前编码: string sH ...

  3. Custom Action : dynamic link library

    工具:VS2010, Installshield 2008 实现功能: 创建一个C++ win32 DLL的工程,MSI 工程需要调用这个DLL,并将Basic MSI工程中的两个参数,传递给DLL, ...

  4. InstallShield : 如何查找编译后的 Merge Module存放路径

    工程菜单栏中依次选择  Tools ---> Options… ,选择 Merge Modules tab 页,如下,就会看到Merge Module的存放路径,也可以根据需求修改. Merge ...

  5. Java小程序---接口中抽象方法的实现(解决了JAVA语言不能多继承的问题)

    public interface Sing { public static final String eyecolor="black"; public void sleep(); ...

  6. JS判断是否微信浏览器

    JS判断是否微信浏览器 function isWeixinBrowser(){ var ua = navigator.userAgent.toLowerCase(); return (/microme ...

  7. Sql Server 判断表或数据库是否存在

    发布:thebaby   来源:脚本学堂     [大 中 小] 本文详细介绍了,在sql server中判断数据库或表是否存在的方法,有理论有实例,有需要的朋友可以参考下,一定有帮助的.原文地址:h ...

  8. 《C和指针》读书笔记——第一章 快速上手

    1.注释代码可以用: #if 0 statements #endif 2.参数被声明为const,表明函数将不会修改函数调用者的所传递的这个参数. 3.scanf("%d",&am ...

  9. Django操作数据库

    引入models的定义 from app.models import  myclass class  myclass():      aa =  models. CharField (max_leng ...

  10. hdu 2222 Keywords Search ac自动机入门

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2222 题意:有N(N <= 10000)个长度不超过50的模式串和一个长度不超过1e6的文本串. ...