连接:客户端进程和服务器进程之间的一条物理路径
会话:数据库的一个逻辑实体,由客户端进程和服务器进程搭建起来,作为2个进程之间通信的信道
一、专用服务器连接
1.在linux上,可以在同一台机器上运行客户端和服务器进程,能很清楚的看出这种父/子进程关系
SYSTEM@PROD> select a.spid dedicated_server,b.process clientpid
2 from v$process a,v$session b
3 where a.addr=b.paddr and
4 b.sid=(select sid from v$mystat where rownum=1);
DEDICATED_SE CLIENTPID
------------ ------------
4606 4557
SYSTEM@PROD> !/bin/ps -ef | grep 4557
oracle 4557 8686 0 15:25 pts/3 00:00:00 sqlplus 客户端进程(父进程)
oracle 4606 4557 0 15:25 ? 00:00:00 oraclePROD (DESCRIPTION=(LOCAL=YES)
(ADDRESS=(PROTOCOL=beq))) 服务端进程(子进程)
即:sqlplus进程是父进程->oraclePROD是子进程,能很清楚的看出了这种父/子进程关系。谁发起谁是父进程
DESCRIPTION=(LOCAL=YES)说明客户端进程是本地的
DESCRIPTION=(LOCAL=NO)说明客户端进程是远程的
2.可以使用sqlplus在看看实际的连接和会话是什么样子。这里使用了autotrace命令,发现有两个会话
,我们在一条连接创建了2个会话。一条连接上的不同会话可以使用不同的用户身份
即:一个连接上可以创建0个、1个、多个会话,每个会话都是独立的。
一个会话可以有连接也可以没有连接(会话会空闲)
[oracle@secdb1 ~]$ sqlplus system/oracle 使用system用户进入sqlplus
SYSTEM@PROD> select username,sid,serial#,server,paddr,status from v$session
2 where username=USER;
USERNAME SID SERIAL# SERVER PADDR STATUS
------------------------------ ---------- ---------- --------- -------- --------
SYSTEM 110 24 DEDICATED329DB9DCACTIVE
只需打开autotrace来查看sqlplus中所执行语句的统计结果
SYSTEM@PROD> set autotrace on statistics 打开执行计划中的统计信息
SYSTEM@PROD> select username,sid,serial#,server,paddr,status from v$session
2 where username=USER;
USERNAME SID SERIAL# SERVER PADDR STATUS
------------------------------ ---------- ---------- --------- -------- --------
SYSTEM 109 183 DEDICATED329DB9DCINACTIVE 监控会话
SYSTEM 110 24 DEDICATED329DB9DCACTIVE 实际会话
这个109 110会话使用了一个329DB9DC进程地址,也就是一个连接创建了2个会话
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
0 consistent gets
0 physical reads
0 redo size
774 bytes sent via SQL*Net to client
381 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
2 rows processed
SYSTEM@PROD> set autotrace off 关闭执行计划
Sqlplus中启用AUTOTRACE时,如果我们执行DML操作(insert update delete merge)
(1)如果还不存在“监控会话”,它会使用当前连接创建一个新会话(监控会话109)
(2)要求这个新会话查询v$sesstat视图来记住实际会话的初始统计值。
(3)在原会话中运行DML操作
(4)DML语句执行结束后,sqlplus会请求监控会话再次查询v$sesstat视图,并生成前面的所示报告,显示出实际会话的统计结果只差。
3.现在使用sqlplus来查看一条没有任何会话的连接,在sqlplus窗口中键入一条disconnect命令
SYSTEM@PROD> disconnect 关闭所有会话
Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
@> show user
USER is "" 没有登录用户
@> select username,sid,serial#,server,paddr,status from v$session
2 where username=USER;
SP2-0640: Not connected 只是说明没有会话了,但连接还在
注:从技术上讲,这个命令应该叫distroy_all_session(破坏所有会话)更合适,而不是disconnect,因为我们并没有真正断开物理连接。如果想断开物理连接,应该执行“exit”
@> exit
[oracle@secdb1 ~]$
[oracle@secdb1 ~]$ sqlplus / as sysdba 使用sys用户来查询system用户的会话
SYS@PROD> select * from v$session where username='SYSTEM'; 可以看到,这个system用户下没有会话
no rows selected
但PADDR329DB9DC进程还存在,对应的有一条物理连接。
SYS@PROD> select username,program from v$process where addr='329DB9DC';
USERNAME PROGRAM
--------------- ------------------------------------------------
oracle oracle@secdb1 (TNS V1-V3)
4.现在使用sqlplus的connect命令创建一个新会话,但还是使用原来的PADDR329DB9DC进程连接
@> conn system/oracle
Connected.
SYSTEM@PROD>
SYSTEM@PROD> select username,sid,serial#,server,paddr,status from v$session
2 where username=USER;
USERNAME SID SERIAL# SERVER PADDR STATUS
SYSTEM 104 31 DEDICATED329DB9DCACTIVE
可以注意到,PADDR329DB9DC还是使用原来的进程连接,但SID是新的会话ID了,可能会分配原来的SID,也可能是新的SID,这取决于在我们注销时是否有别人登录,以及我们原来的SID是否可用。
注:最常见的是一个连接对应一个会话,这也是大多数人每天所看到的情况
1)专用服务器模式下UGA在PGA中分配空间
2)共享服务器模式下UGA在SGA中分配空间
oracle视频教程请关注:http://u.youku.com/user_video/id_UMzAzMjkxMjE2.html
转载于:https://blog.51cto.com/19880614/1279818