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 ...
随机推荐
- 测试中的几个case
一.页面上对引起 大量数据提交的 按钮/链接 点击一次后, disable 需求: 对于重要的表单.数量庞大/响应慢的系统,在做提交时, 又有页面还在loading状态, 此时连续做两次点击, 经常 ...
- Swift轻松入门——基本语法介绍和详细地Demo讲解(利用WebView打开百度、新浪等网页)
转载请务必注明出处(all copyright reserved by iOSGeek) 本文主要分为两个部分,第一部分介绍Swift的基本语法,第二部分讲解一个利用WebView来打开百度.sina ...
- 【html】【18】高级篇--下拉列表[竖向手风琴]
下载: http://sc.chinaz.com/jiaoben/141027501240.htm html: <!DOCTYPE html> <html> <head ...
- java新手笔记26 Frame
0.Calculater package com.yfs.javase; import java.awt.BorderLayout; import java.awt.Button; import ja ...
- C++成员变量初始化顺序问题
由于面试题中,考官出了一道简单的程序输出结果值的题:如下, class A { private: int n1; int n2; public: A():n2(0),n1(n2+2){} void P ...
- C#与C++相比较之STL篇(续一)
本篇接<C#与C++相比较之STL篇>,主要探索C++STL的两个组件:算法和仿函数,以及C#的linq和拉姆达表达式.委托. STL的算法与仿函数 算法是个庞大的主题,STL包含了超过1 ...
- MySql的安装与使用
今天因为毕业设计要用到MySql数据库,所以就准备自己安装一个MySQL数据库,但是因为MySQL Install MSI只有32位,所以最后选择使用Windows (x86, 64-bit), ZI ...
- 深入理解javascript中的闭包!(转)
1.闭包的经典错误 假如页面上有若干个div,我们想给它每个绑定一个onclick方法,于是有了下面的代码. function A(){ var divs=document.getElementsBy ...
- 各种OS间文件传输
搞了几天才会这个法子,羞愧难当. Ubuntu安装iptux,windows下是飞鸽传输.同局域网下可以聊天,传送文件或文件夹.文件夹速度大概10M/S. 其他共享方法: ftp服务器,不成功 sam ...
- LPC17XX 数据手册摘要之系统时钟与功率控制
系统时钟与功率控制 一.系统时钟 LPC17XX有三个独立的时钟振荡器,分别是主振荡器(MIAN_OSC).内部RC振荡器(IRC_OSC).实时时钟振荡器(RTC_OSC).LPC17XX时钟框图如 ...