求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Modeler   Code  
会员   
 
  
 
 
 
理解oracle中连接和会话
 

2010-04-16 来源:网络

 

1.概念不同:概念不同:

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

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

2.关系是多对多:

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

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

3. 概念应用:概念应用:

  • oracle的sessions参数决定的是会话数而不是物理连接数。
  • oracle的临时表中的数据是各会话间隔离的,而与连接概念无关。
  • 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正忙,那就得一样地等。



MySQL索引背后的数据结构
MySQL性能调优与架构设计
SQL Server数据库备份与恢复
让数据库飞起来 10大DB2优化
oracle的临时表空间写满磁盘
数据库的跨平台设计
更多...   


并发、大容量、高性能数据库
高级数据库架构设计师
Hadoop原理与实践
Oracle 数据仓库
数据仓库和数据挖掘
Oracle数据库开发与管理


GE 区块链技术与实现培训
航天科工某子公司 Nodejs高级应用开发
中盛益华 卓越管理者必须具备的五项能力
某信息技术公司 Python培训
某博彩IT系统厂商 易用性测试与评估
中国邮储银行 测试成熟度模型集成(TMMI)
中物院 产品经理与产品管理
更多...