ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Oracle 连接和会话的区别

Oracle 连接和会话的区别

原创 Linux操作系统 作者:ciwei_no1 时间:2012-06-05 17:19:30 0 删除 编辑
 
转自:http://blog.chinaunix.net/uid-9124312-id-172075.html

连接并不是会话的同义词,发现这一点时很多人都很诧异。在大多数人眼里,它们都是一样的,但事实上并不一定如此。在一条连接上可以建立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有详细的说明。
* 会话(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

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

USERNAME      SID    SERIAL# SERVER    PADDR STATUS
------------------------------ ---------- ---------- --------- -------- --------
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的唯一标识。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/22980662/viewspace-731973/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2010-12-29

  • 博文量
    24
  • 访问量
    54190