作者:david_zhang@sh 【转载时请以超链接形式标明文章】
链接:http://www.cnblogs.com/david-zhang-index/archive/2012/09/13/2682876.html
连接和会话不是同义词。连接是从客户端到oracle实例的一条物理路径;会话是实例中存在的一个逻辑实体;
在一个连接上可以建立0个、一个或多个会话;一个会话可以有或者也可以没有连接;
试验一:一个连接上多个会话
1 SQL> select username,sid,serial#,server,paddr,status from v$session where username='SYS'; 2 3 USERNAME SID SERIAL# SERVER PADDR STATUS 4 ---------- ---------- ---------- --------- ---------------- -------- 5 SYS 659 35747 DEDICATED 00000001DC88BDA0 ACTIVE 6 7 SQL> set autotrace on statistics; 8 SQL> select username,sid,serial#,server,paddr,status from v$session where username='SYS'; 9 10 USERNAME SID SERIAL# SERVER PADDR STATUS 11 ---------- ---------- ---------- --------- ---------------- -------- 12 SYS 648 65428 DEDICATED 00000001DC88BDA0 INACTIVE 13 SYS 659 35747 DEDICATED 00000001DC88BDA0 ACTIVE 14 15 16 Statistics 17 ---------------------------------------------------------- 18 17 recursive calls 19 0 db block gets 20 0 consistent gets 21 0 physical reads 22 0 redo size 23 991 bytes sent via SQL*Net to client 24 520 bytes received via SQL*Net from client 25 2 SQL*Net roundtrips to/from client 26 0 sorts (memory) 27 0 sorts (disk) 28 2 rows processed 29 30 SQL> set autotrace off;
试验中,进行了两次查询,一次是没有开启autotrace,paddr表示服务器进程地址(实质是一个连接id);开启autotrace查询,可以看到两条结果(两个会话)但是paddr是相同的(即同一连接)。
试验二:在上个试验的基础上,实验二证明没有任何会话连接依然存在情况
1 SQL> disconnect; 2 Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production 3 With the Partitioning, OLAP, Data Mining and Real Application Testing options 4 5 SQL> conn test/test 6 Connected. 7 SQL> select * from v$session where uername = 'SYS'; 8 no rows selected 10 SQL> select username,program from v$process where addr = hextoraw ('00000001DC88BDA0'); 11 12 USERNAME PROGRAM 13 ---------- ------------------------------------------------ 14 oracle oracle@DCMSBDM (TNS V1-V3)
disconnect表示关闭所有会话,在用test账号登陆数据库查看sys会话(这里说明下,在试验一中最好不好用sys账号做,可以新建一个账号),会发现没有会话,因为disconnect了,但是通过paddr在v$process里面可以查到仍有一个进程物理连接,所以就有没有会话的“连接”。
使用sqlplus的conn命令再次连接进来,在原来的进程中又创建一个新会话,如下,而paddr依然是同一个,更加证明这个问题。
1 SQL> conn /as sysdba 2 Connected. 3 SQL> select username,sid,serial#,server,paddr,status from v$session where username='SYS'; 4 5 USERNAME SID SERIAL# SERVER PADDR STATUS 6 ---------- ---------- ---------- --------- ---------------- -------- 7 SYS 659 35851 DEDICATED 00000001DC88BDA0 ACTIVE