oracle的会话。会话与连接详解

connect 物理连接,网络或者本地
session 实例中的一个逻辑实体
有连接就有会话

select serail#,sid,username from v$session where username is null;

 

四种连接:

1、无连接无会话无进程: sqlplus /nolog;
2、单个连接单个会话单个进程: sqlplus/ as sysdba;
3、无会话有进程: 两个用户连接,一个用户disconnect。disconnect会话断开,连接不断开

通过连接进程号推出用户
desc v$process
select ADDR from v$process where SPID='linux连接进程'
select serail#,sid,username from v$session where paddr='上句查询的ADDR'
如果nows selected 可以kill

4、单个连接但是有多个会话set autotrace on
set autotrace off
总结:必须先建立连接,才可以再建立会话,会话建立以后用户才可以执行sql语句


用PL/SQL连接一个用户数据库,并执行sql:
select username,sid,serial#,server,paddr,status from v$session where username=USER --USER是系统函数,结果为当前连接数据库的用户。
结果如下:
username sid serial server paddr status
VSESSION 5546 40741 DEDICATED 00000018E1898048 INACTIVE
VSESSION 6208 40561 DEDICATED 00000018919221F0 ACTIVE
可以看到有两个会话,而第一个会话是inactive。再执行
select * from v$session where username='VSESSION'
观察得第一个会话的ACTION字段为primary Session 为初级会话,执行sql时初级会话已不再活动

反而关闭PL/SQL重新连接到该用户,不执行sql,在sqlplus连接到用户,在sqlplus中查询:
SQL> select username,sid,serial#,server,paddr,status from v$session where username=USER;

USERNAME SID SERIAL# SERVER PADDR
------------------------------ ---------- ---------- --------- ----------------
STATUS
--------
VSESSION 5546 41769 DEDICATED 00000018E1898048
INACTIVE

VSESSION 6208 41647 DEDICATED 00000018919221F0
还是会看到初级连接

我们把连接数提升到四个:
现在已经有两个了
第三个:
在sqlplus中执行:
SQL> set autotrace on statistics
SQL> select username,sid,serial#,server,paddr,status from v$session where username=USER;

USERNAME SID SERIAL# SERVER PADDR
------------------------------ ---------- ---------- --------- ----------------
STATUS
--------
VSESSION 5546 41769 DEDICATED 00000018E1898048
INACTIVE

VSESSION 6206 37273 DEDICATED 00000018919221F0
INACTIVE

VSESSION 6208 41647 DEDICATED 00000018919221F0
ACTIVE

 

Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
0 consistent gets
0 physical reads
0 redo size
1024 bytes sent via SQL*Net to client
520 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
3 rows processed
第四个:
在PL/SQL中开一个sql窗口,执行
select username,sid,serial#,server,paddr,status from v$session where username=USER;
USERNAME SID SERIAL# SERVER PADDR status
VSESSION 1455 15843 DEDICATED 00000018B18949C0 ACTIVE
VSESSION 5546 41769 DEDICATED 00000018E1898048 INACTIVE
VSESSION 6206 37273 DEDICATED 00000018919221F0 INACTIVE
VSESSION 6208 41647 DEDICATED 00000018919221F0 INACTIVE
这四个会话中, 第一个是plsql的初级会话(连接上后的初级会话)
第二个是plsql的开sql窗口后执行sql的会话
第三个是sqlplus中用户执行语句的会话
第四个是sqlplus中用户执行执行计划统计信息收集的会话


总结:有连接就有会话
plsql连接到数据库是一个会话
开个sql窗口又使一条会话
选择sql语句按F5查看执行计划又是一个窗口,又是一条会话

---PL/SQL中每个窗口是一个会话,初始是一个
---sqlplus中dml是一个,set autotrace 是一个

*****
实际上,一个连接有多个会话是非常普遍的。使用SQL*Plus可以说明连接和会话间的区别。使用autotrace命令时可产生两个会话。通过一个使用单个进程的连接也可以建立两个会话。首先,执行以下操作。

SQL>select username,sid,serial#,server,paddr,status
from v$session
where username=USER
/
USERNAME SID SERIAL#SERVER PADDR STATUS
----------- --- ------ ------ ------------ -----
OPS$TKYTE 153 3196 DEDICATED AE4CF614 ACTIVE

其中,user是系统函数,结果为当前连接数据库的用户。目前结果显示的是一个单独连接专用服务器的会话。PADDR列是唯一的专用服务器进程的地址。
其次,打开autotrace,来查看在SQL*Plus中执行语句的统计数据。

SQL>set autotrace on statistics
SQL>select username,sid,serial#,server,paddr,status
from v$session
where username=USER
/

这样,就打开了两个会话,但是两者都使用一个专用服务器进程。查询结果显示它们都有相同的PADDR列值。因此,两个会话使用一个进程,即单个连接。注意,其中一个会话,即最初的会话(SQL*Plus),是处于主动(active)状态。该会话运行查询显示结果信息。但另外一个处于被动状态(inactive)的会话就是autotrace会话,其职责是监视第一个会话并报告该会话所做的一切。
在SQL*Plus中打开autotrace后,当执行DML操作(insert、update、delete、select和merge)时,SQL*Plus将完成下列操作。
1)如果第二个会话不存在,则使用当前连接创建一个新的会话。
2)SQL*Plus要求产生的新会话查询v$sesstat视图,为运行DML的会话记录初始统计数据。
3)在第一个会话中运行DML操作。
4)在完成DML语句后,SQL*Plus 将要求其他会话再次查询V$sesstat并产生显示执行DML会话在统计数据上的差异报告。
如果关闭autotrace,SQL*Plus将终止第二个会话并不再监视v$session视图。









posted @ 2017-03-29 10:58  answer_ma  阅读(6369)  评论(0编辑  收藏  举报