oracle database resident connection pooling(驻留连接池)
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(驻留连接池)的更多相关文章
- 11.2.0.4单实例DRCP(Database Resident Connection Pooling)简单测试
DRCP配置及测试 一. DRCP介绍 数据库提供会话进程在数据库中使用资源的方式: 1)Dedicated Server,一个会话在数据库中对应一个专有进程,一对一服务(资源数据库占用过多,一般使用 ...
- DataSource接口 Connection pooling(连接池
一.DataSource接口是一个更好的连接数据源的方法: JDBC1.0是原来是用DriverManager类来产生一个对数据源的连接.JDBC2.0用一种替代的方法,使用DataSource的实 ...
- [SQLite3]connection string的连接池参数引发的错误
最近在.net中使用Sqlite数据库,发现.net的驱动做得不错,而且实现了加密功能.于是想给自己的数据库加上口令,结果,多次实验都以失败告终: 链接数据库,然后ChangePassword都成功执 ...
- [转].Net连接池超时注意事项
http://blog.csdn.net/jxqvip/article/details/6738551 超时时间已到.超时时间已到,但是尚未从池中获取连接.出现这种情况可能是因为所有池连接均在使用,并 ...
- Spring boot中配置HikariCP连接池
# jdbc_config datasourcespring.datasource.driver-class-name=com.mysql.cj.jdbc.Driverspring.datasourc ...
- Oracle ODP.NET连接池
数据库连接池 连接池是数据库连接的缓存,每当应用程序需要连接数据库时向连接池申请数据库连接,连接池负责具体数据库连接的创建和销毁.连接池中的数据库连接会缓存一段时间,后续的连接请求首先使用缓存中的数据 ...
- 结合使用 Oracle Database 11g 和 Python
结合使用 Oracle Database 11g 和 Python 本教程介绍如何结合使用 Python 和 Oracle Database 11g. 所需时间 大约 1 个小时 概述 Python ...
- Sql Server 连接池及其用法
其实我们一直在使用SqlServer的连接池.在连接字符串中,Pooling为是否启用连接池,默认值为true,表示启用. 与连接池相关的两个重要参数是 Min Pool Size和 Max Pool ...
- 《深入理解mybatis原理》 Mybatis数据源与连接池
对于ORM框架而言,数据源的组织是一个非常重要的一部分,这直接影响到框架的性能问题.本文将通过对MyBatis框架的数据源结构进行详尽的分析,并且深入解析MyBatis的连接池. 本文首先会讲述MyB ...
随机推荐
- spring中加入log4j
spring中加入log4j <context-param> <param-name>log4jConfigLocation</param-name> <pa ...
- Kettle ETL 来进行mysql 数据同步——试验环境搭建(表中无索引,无约束,无外键连接的情况)
今天试验了如何在Kettle的图形界面(Spoon)下面来整合来mysql 数据库中位于不同数据库中的数据表中的数据. 试验用的数据表是customers: 第三方的数据集下载地址是:http://w ...
- 国外一些知名ASP.Net开源CMS系统
1.Ludico Ludico是C#编写的居于ASP.NET 2.0的Portal/CMS系统.它的模块化设计是你可以按照你希望的使用或开发网站功能.它里面有高级的用户管理,一个所见即所的(WYSIW ...
- System.Web.Mvc.Html 命名空间小计(转)
最近在看MVC框架,发现这个博文对初学者可能有帮助,故转之. 1,Html.Action 使用指定参数调用指定子操作方法并以 HTML 字符串形式返回结果. Html.Action() < ...
- 一个layer可以跟着画完的线移动ios程序 好玩啊。
用法:采用的是关键帧实现的. 实验目的:让上层的layer子层能够跟着在另一个子层上花的线进行移动 .即当线画完之后,图形开始移动,并且能够停在最后的那个位置 效果图: 采用是直接在layer图层上进 ...
- iOS 成员变量的作用范围
/* 成员变量的作用范围: @public:在任何地方都能直接访问对象的成员变量 @private:只能在当前类的对象方法中直接访问,如果子类要访问需要调用父类的get/set方法 @protecte ...
- Web前端新人之CSS样式选择器
最近在学习css样式.那么我就想先整理一下css样式的选择器 规则结构: 每个规则都有两个基本部分:选择器和声明块.声明块由一个或者多个声明组成,每个声明则是一个属性—值对(property-valu ...
- html标签对应的英文原文
标签 对应英文 说明 <!--> / 注释 <!DOCTYPE> document type 文档类型 <a> anchor 超链接 <abbr> ab ...
- C# winform关于DataGridView的一些操作
设置字段名 设置字段值 设定单元格表示 Error图标 设定当前单元格 取得当前单元格内容 取得当前单元格的列 Index 取得当前单元格的行 Index 向下一行 向上一行 取消 DataGridV ...
- 如何读懂Oracle文档中的语法图(转)
本文转载自:http://kyle.xlau.org/posts/syntax-diagrams.html Oracle文档中用到了两种表达语法的方法,语法图和BNF. BNF, Backus-Nau ...