连接:客户端进程和服务器进程之间的一条物理路径


会话:数据库的一个逻辑实体,由客户端进程和服务器进程搭建起来,作为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