Oracle数据库链接和会话的区别

 链接并非会话的同义词,发现这一点时不少人都很诧异。在大多数人眼里,它们都是同样的,但事实上并不必定如此。在 一条链接上能够创建0个、一个或多个会话。各个会话是单独并且独立的,即便它们共享同一条 数据库物理链接也是如此。一个会话中的提交不会影响该链接上的任何其余会话。实际上,一条链接上的各个会话可使用不一样的用户身份!

  在Oracle中,链接只是客户进程和数据库实例之间的一条特殊线路,最多见的就是网络链接。这条链接可能链接到一个专用服务器进 程,也可能链接到调度器。如前所述,链接上能够有0个或多个会话,这说明能够有链接而无相应的会话。另外,一个会话能够有链接也能够没有链接。使用高级 Oracle Net特性(如链接池)时,客户能够删除一条物理链接,而会话依然保留(可是会话会空闲)。客户在这个会话上执行某个操做时,它会从新创建物理链接。下面 更详细地定义这些术语:* 链接(connection):链接是从客户到Oracle实例的一条物理路径。链接能够在网络上创建,或者经过IPC机制创建。一般会在客户进程与一个 专用服务器或一个调度器之间创建链接。不过,若是使用Oracle的链接管理器(Connection Manager ,CMAN),还能够在客户和CMAN之间以及CMAN和数据库之间创建链接。CMAN的介绍超出了本书的范围,不过Oracle Net Services Administrator‘s Guide(能够从http://otn.oracle.com免费获得)对CMAN有详细的说明。 sql

  * 会话(session):会话是实例中存在的一个逻辑实体。这就是你的会话状态(session state),也就是表示特定会话的一组内存中的数据结构。提到“数据库链接”时,大多数人首先想到的就是“会话”。你要在服务器中的会话上执行SQL、提交事务和运行存储过程。 数据库

  可使用SQL*Plus来看一看实际的链接和会话是什么样子,从中还能够了解到,实际上一条链接有多个会话的状况至关常见。这里使用了 AUTOTRACE命令,并发现有两个会话。咱们在一条链接上使用一个进程建立了两个会话。如下是其中的第一个会话:sqlplus "storm/unimas" SQL> select username, sid, serial#, server, paddr, status from v$session where username = 'STORM';USERNAME SID SERIAL# SERVER PADDR STATUS 服务器

  ------------------------------ ---------- ---------- --------- -------- -------- 网络

  STORM 148 60 DEDICATED 30A1BDCC INACTIVE session

  SQL> set autotrace on statistics SP2-0618: Cannot find the Session Identifier. Check PLUSTRACE role is enabled SP2-0611: Error enabling STATISTICS report SQL> 数据结构

  碰到错误,原来是没有添加PLUSTRACE role sqlplus "sys/unimas as sysdba" SQL> create role plustrace;Role created. SQL> grant select on v_$sesstat to plustrace;Grant succeeded. SQL> grant select on v_$statname to plustrace;Grant succeeded. SQL> grant select on v_$mystat to plustrace;Grant succeeded. SQL> grant plustrace to dba with admin option;Grant succeeded. SQL> grant plustrace to STORM;Grant succeeded. 并发

  从新登陆storm SQL> set autotrace on statistics oracle

  USERNAME SID SERIAL# SERVER PADDR STATUS ide

  ------------------------------ ---------- ---------- --------- -------- -------- ui

  STORM 141 180 DEDICATED 30A1BDCC INACTIVE STORM 148 62 DEDICATED 30A1BDCC INACTIVE

  SQL> disconnect

  从技术上讲,这个命令应该叫DESTROY_ALL_SESSIONS更合适,而不是DISCONNECT,由于咱们并无真正物理地断开链接。

  在SQL*Plus中要真正地断开链接,应该执行“exit”命令,由于你必须退出才能彻底撤销链接。

  SQL> select username, sid, serial#, server, paddr, status from v$session where username = 'STORM';no rows selected

  能够看到,这个帐户名下没有会话,可是仍有一个进程,相应地有一条物理链接(使用前面的ADDR值)

  SQL> select username, program from v$process where addr = hextoraw('30A1BDCC');

  USERNAME PROGRAM

  --------------- ------------------------------------------------

  oracle oracle@hb (TNS V1-V3)

  SQL>因此,这就有了一条没有相关会话的“链接”。可使用SQL*Plus的CONNECT命令(这个命令的名字也起得不恰当),在 这个现有的进程中建立一个新会话(CONNECT命令叫CREATE_SESSION更合适):能够看到,这个帐户名下没有会话,可是仍有一个进程,相应 地有一条物理链接(使用前面的ADDR值)

  SQL> select username, sid, serial#, server, paddr, status from v$session where username = 'STORM';

  USERNAME SID SERIAL# SERVER PADDR STATUS

  ------------------------------ ---------- ---------- --------- -------- --------

  STORM 153 58 DEDICATED 30A1BDCC INACTIVE

  能够注意到,PADDR仍是同样的,因此咱们仍是在使用同一条物理链接,可是(可能)有一个不一样的SID.我说“可能有”,是由于也许还会分配一样的SID,这取决于在咱们注销时是否有别人登陆,以及咱们原来的SID是否可用。

  另外:Serial# is in v$session. It is an Oracle generated value used in combination with the SID to create a unique session identifier. SID和SERIAL合起来能做为一个session的惟一标识。

相关文章
相关标签/搜索