搞清“链接”和“会话”

对Oracle中链接和会话的含义,老是有些模糊,参考TOM大叔的《Oracle编程艺术》,从新整理了下知识点。
sql


在Oracle中,“链接”不是“会话”的同义词,一个链接上能够建立0个、1个或多个会话,多个独立的会话能够经过一个链接关联在一块儿,甚至能够独立于链接存在(无链接),各个会话之间是独立的,即便他们共享数据库上的同一个物理链接亦是如此。一个链接上的各个会话能够属于不一样的数据库用户。
数据库


链接,connection,能够说是客户端进程和数据库实例之间的一条物理路径,例如网络链接、IPC,这个链接可能链接到一个专用服务器进程(dedicated server),或者是一个调度器进程(shared server)。
编程


会话,session,是数据库中的一个逻辑实体,客户端进程能够经过他在数据库中执行SQL等操做,你所看到的会话状态信息,表明了你的会话在实例内存中的数据结构的集合,会话是在数据库上执行SQL、提交事务和运行存储过程的地方。服务器


导图,
微信


咱们经过实验,更直观地来看链接和会话的区别和联系。网络


sqlplus登陆数据库,能够看到这是个和专用服务器链接的会话,其中PADDR是这个专用服务器进程的地址,session

SQL> select username, sid, serial#, server, paddr, status
  2  from v$session
  3  where username = USER;

USERNAME                              SID    SERIAL# SERVER    PADDR            STATUS
------------------------------ ---------- ---------- --------- ---------------- --------
BISAL                                 131       8681 DEDICATED 000000009F4BEB30 ACTIVE


如今打开autotrace看下执行语句的统计结果,能够看到,此时有了两个会话了,从他们的PADDR的值,能推测这两个会话都使用同一个专用服务器进程,由于咱们是测试,因此当前操做系统中只启动了一个进程(sqlplus),没建立新的进程,即两个会话,只使用了一个链接。再看下会话状态,一个是ACTIVE,一个是INACTIVE,ACTIVE的会话正在执行SQL,INACTIVE的会话(autotrace的会话)是“监视”实际的会话,报告他作了什么,
数据结构

SQL> set autotrace on statistics

SQL> select username, sid, serial#, server, paddr, status
  2  from v$session
  3  where username = USER;

USERNAME                              SID    SERIAL# SERVER    PADDR            STATUS
------------------------------ ---------- ---------- --------- ---------------- --------
BISAL                                 131       8681 DEDICATED 000000009F4BEB30 ACTIVE
BISAL                                 132       3625 DEDICATED 000000009F4BEB30 INACTIVE

Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          0  consistent gets
          0  physical reads
          0  redo size
        993  bytes sent via SQL*Net to client
        524  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          2  rows processed


之因此启动了新的会话来“监视”执行语句的会话,主要由于若是在同一个会话中观察统计信息,就会对统计信息形成影响,毕竟观察统计信息的操做,也要进行排序、消耗I/O以及网络传输数据等。
oracle


为了清除会话,咱们执行disconnect,此时并未真正物理地断开链接,
app

SQL> disconnect
Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> select * from dual;
SP2-0640Not connected


查看v$session显示用户BISAL未创建任何链接,但使用刚才获得的专用服务器进程地址(PADDR)能看到存在一个进程,有一个物理链接,所以,这就有了一条没有关联会话的链接,

SQL> select * from v$session where username = 'BISAL';
no rows selected

SQL> select username, program
  2  from v$process
  3  where addr = hextoraw('000000009F4BEB30');

USERNAME        PROGRAM
--------------- ------------------------------------------------
oracle          oracle@DEPDBBAK1 (TNS V1-V3)


使用connect在这个没有会话的进程上建立一个新会话,能够看到出现了新的会话,而且PADDR仍是以前的,说明用的仍是原来的专用服务器进程,这个新会话仍是在同一个物理链接,SID是否相同,这个待定,取决于disconnect时是否有别人登陆,以及原来的SID是否可用,

SQL> conn bisal/bisal
Connected.
SQL> select username, sid, serial#, server, paddr, status
  2  from v$session
  3  where username = USER;

USERNAME                              SID    SERIAL# SERVER    PADDR            STATUS
------------------------------ ---------- ---------- --------- ---------------- --------
BISAL                                 131       8683 DEDICATED 000000009F4BEB30 ACTIVE


以上测试,说明了使用专用服务器进程的链接下,“链接”和“会话”,证实了一个链接上能够建立0个、1个或多个会话,科学仍是严谨的,因此对待一些专业的术语,仍是了解清楚,更有助咱们对原理的把控。

本文分享自微信公众号 - bisal的我的杂货铺(gh_e8769c7350b1)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索