前事不忘,后事之师,不忘国耻!

 注册  找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2056|回复: 0

理解oracle中连接和会话

[复制链接]

理解oracle中连接和会话

[复制链接]
ehxz

主题

0

回帖

7251

积分

管理员

积分
7251
2007-12-27 12:59:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

×
1. 概念不同:

连接是指物理的网络连接。

在已建立的连接上,建立客户端与oracle的会话,以后客户端与oracle的交互都在一个会话环境中进行。

2. 关系是多对多:

一个连接上可以建立0个,1个,2个,多个会话。

Oracle允许存在这样的会话,就是失去了物理连接的会话。

3. 概念应用:

l oracle的sessions参数决定的是会话数而不是物理连接数。

l oracle的临时表中的数据是各会话间隔离的,而与连接概念无关。

l jdbc的connection,对oracle是一个会话的概念。

4. 实际应用:

连接池,为了提高数据库交互效率,一般驱动程序都有连接池概念的实现。

Oracle不同的驱动提供两种连接池概念。

一种译为隐式连接缓冲

OracleDataSource ods = new OracleDataSource();

ods.setURL("jdbc:oracle:thin:@10.1.3.60:1521:orcl");

ods.setUser("NC50_DEV");

ods.setPassword("NC50_DEV");

ods.setConnectionCachingEnabled(true);

java.util.Properties jup = new java.util.Properties();

jup.setProperty("InitialLimit", "1");

jup.setProperty("MinLimit", "1");

jup.setProperty("MaxLimit", "2");

ods.setConnectionCacheProperties(jup);

Connection cx0 = ods.getConnection();

隐式连接缓冲在第一次getconnection()时将根据配置初始化连接,并在每一个连接上建立一个会话。然后从这些会话中返回一个给本次调用。以后如果在本次connection.close()前调用getconnection(),将肯定得到另外一个会话。如果初始时建立的会话不够了,那么将新建物理连接,并在连接上建立一个会话。当然不能超过两个限制:1.MaxLimit【见程序,限制物理连接数】。2.sessions【oracle参数】。每次close()并不关闭实际的会话,而是返回连接缓冲中,供另一个getconnection()使用。所以可以得知,如果一个getconnection()中给某一个会话级临时表插入数据,然后close(),那么之后如果这个会话被重新得到,是可以看到插入的数据的。

一种译为OCI连接池。

OracleOCIConnectionPool ods = new OracleOCIConnectionPool();

String tns = "(DESCRIPTION=(ADDRESS_LIST=(ADDRESS="

+ "(PROTOCOL=TCP)(HOST=10.1.3.60)(PORT=1521)))"

+ "(CONNECT_DATA=(SERVICE_NAME=ORCL)))";

ods.setURL("jdbc:oracle:oci:@" + tns);

ods.setUser("NC50_DEV");

ods.setPassword("NC50_DEV");

java.util.Properties jup = new java.util.Properties();

jup.setProperty(OracleOCIConnectionPool.CONNPOOL_MIN_LIMIT, "2"); jup.setProperty(OracleOCIConnectionPool.CONNPOOL_MAX_LIMIT, "2");

jup.setProperty(OracleOCIConnectionPool.CONNPOOL_INCREMENT, "0");

ods.setPoolConfig(jup);

Connection cx0 = ods.getConnection();

OCI连接池在第一次getconnection()时将根据配置初始化连接,并在每一个连接上建立一个会话。注意,连接上一旦建立了一个会话,这个连接将还可以再建会话。那么在此时,会任取一个建完会话的物理连接再建一个会话返回。当然这时也要受限于sessions设置。对于OCI连接池,每一个connection.close()都将实际关闭会话,但物理连接保留。所以可以得知,如果一个getconnection()中给某一个会话级临时表插入数据,然后close(),那么此数据将被删除。

5.关于专用服务器模式下processes参数

对于隐式连接缓冲,每一个连接上建立一个会话,对于每一个会话都将对应一个dedicated process。

对于OCI连接池,只有物理连接上建立的那个会话才对应一个dedicated process(这里记为DP_A,DP_B)。而其他会话对应一个PSUEDO process.这是一个轻量级process,它是不算processes数的。

所以关于这个问题“专用服务器模式是一个物理连接对应一个process,还是一个会话对应一个process?”,从这里可以理解oracle的设计思路确实一个是会话对应一个process,与物理连接不相关。但是实际的实现呢?当oci获得的connection上执行sql时,ORCLED的响应还是会借助到DP_A,DP_B上,如果DP_A,DP_B正忙,那就得一样地等。
免责申明1、欢迎访问本站,本文内容及相关资源来源于网络,版权归版权方所有!本站原创内容版权归本站所有,请勿转载!
2、本文内容仅代表作者观点,不代表本站立场,作者自负,本站资源仅供学习研究,请勿非法使用,否则后果自负!请下载后24小时内删除!
3、本文内容,包括但不限于源码、文字、图片等,仅供参考。本站不对其安全性,正确性等作出保证。但本站会尽量审核会员发表的内容。
4、如本帖侵犯到任何版权问题,请立即告知本站 ,本站将及时删除并致以最深的歉意!客服邮箱:admin@dbabbs.com
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|小黑屋|DBA论坛中国 ( 鲁ICP备20017503号-2 )

GMT+8, 2024-12-22 11:46 , Processed in 2.631574 second(s), 10 queries , MemCached On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表