Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2371945
  • 博文数量: 473
  • 博客积分: 12252
  • 博客等级: 上将
  • 技术积分: 4307
  • 用 户 组: 普通用户
  • 注册时间: 2007-10-12 10:02
文章分类

全部博文(473)

文章存档

2012年(8)

2011年(63)

2010年(73)

2009年(231)

2008年(98)

分类: Oracle

2009-09-30 15:46:08

理解oracle中连接和会话

 

1.      概念不同:

连接是指物理的客户端到oracle服务端的连接。一般是通过一个网络的连接。

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

2.   关系是多对多:[同意网友的意见,应该是1对多。一个会话要么没有连接,要么在一个连接上。]

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

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

3.      概念应用:

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

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

l        jdbcconnection,对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.sessionsoracle参数】。每次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()时将根据配置初始化连接,并在每一个连接上建立一个会话。注意,连接上一旦建立了一个会话,这个连接将还可以再建会话。那么在此时,会任取一个建完会话的物理连接再建一个会话返回。这样看来似乎OCI连接池只需建立一个物理连接就可以建立任意多的会话,当然这时也要受限于oracle允许的sessions设置。实际上OCI到底1个物理连接对应多少个会话,OCI自身有一个对应用透明的管理。但是CONNPOOL_MAX_LIMIT一定是限制住此客户端可用的物理连接数的。对于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.JTA事务管理,是针对多个会话的DB访问,维系在一个事务中。这个概念是多会话,而不是刻意强调多个数据源(两个ORACLE),甚至异种数据库。JDBC事务管理,是建立在一个会话上的事务。
3.processes参数控制的是oracle所有进程/线程,不仅仅是专用server,包括后台普通进程,典型的如果在MTS模式下,还包括dispatcher。而OCI下连接PSUEDO process的作用有点类似MTS模式下的dispatcher,但它不受processes限制。同时注意即使有这个PSUEDO process存在,专用模式和MTS还是截然不同,因为专用模式下必须等到DP_A,DP_B的客户会话关闭后才可用DP_A,DP_B来服务PSUEDO process对应的客户会话,而MTS是不等会话结束就拉过来服务了。
官方解释

1.1 connection:
   A connection is a physical path from a client to an Oracle instance. A connection is established either over a network or over an IPC mechanism. A connection is typically between a client process and either a dedicated server or a dispatcher. However,using Oracle’s Connection Manager (CMAN), a connection may be between a client and CMAN, and CMAN and the database.
 
1.2 session
   A session is a logical entity that exists in the instance. It is your session state, or a collection of data structures in memory that represents your unique session. It is what would come first to most people’s minds when thinking of a “database connection.” It is your session in the server, where you execute SQL, commit transactions, and run stored procedures.
 
1.3 connection vs. session
   A connection may have zero, one, or more sessions established on it. Each session is separate and independent,even though they all share the same physical connection to the database. A commit in one session does not affect any other session on that connection. In fact, each session using that connection could use different user identities!
   In Oracle, a connection is simply a physical circuit between your client process and the database instance—a network connection, most commonly. The connection may be to a dedicated server process or to a dispatcher. As previously stated, a connection may have zero or more sessions, meaning that a connection may exist with no corresponding sessions. Additionally, a session may or may not have a connection. Using advanced Oracle Net features such as connection pooling, a physical connection may be dropped by a client, leaving the session intact (but idle). When the client wants to perform some operation in that session, it would reestablish the physical connection.
阅读(2542) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~