oracle中连接与会话不是一个概念!!!在Oracle中,连接只是客户进程和数据库实例之间的一条特殊线路,最常见的就是网络连接。这条连接可能连接到一个专用服务器进程,也可能连接到调度器。如前所述,连接上可以有0个或多个会话,这说明可以有连接而无相应的会话。另外,一个会话可以有连接也可以没有连接。使用高级Oracle Net特性(如连接池)时,客户可以删除一条物理连接,而会话依然保留(但是会话会空闲)。客户在这个会话上执行某个操作时,它会重新建立物理连接。下面事例显示一个连接有两个会话的情况...1.查询v$session以显示会话信息sys@OCP10G> select saddr,sid,serial#,paddr,user#,username,process,server,status from v$session where username=USER;SADDR SID SERIAL# PADDR USER# USERNAME PROCESS SERVER STATUS-------- ---------- ---------- -------- ---------- ------------------------------ ------------ --------- --------6EDBCCEC 144 33 6ECF1864 0 SYS 2752:1860 DEDICATED ACTIVE2.把autotrace设置为on,再次查询v$sessionsys@OCP10G> set autotrace onsys@OCP10G> select saddr,sid,serial#,paddr,user#,username,process,server,status from v$session where username=USER;SADDR SID SERIAL# PADDR USER# USERNAME PROCESS SERVER STATUS-------- ---------- ---------- -------- ---------- ------------------------------ ------------ --------- --------6EDBCCEC 144 33 6ECF1864 0 SYS 2752:1860 DEDICATED ACTIVE6EDC269C 149 147 6ECF1864 0 SYS 2752:1860 DEDICATED INACTIVE可以看到本次连接有两个会话,一个是查询时候的会话(sid,serial#)为(144,33),另一个为autotrace的会话(sid,serial#)为(149,147)!这两个session的saddr不同,paddr,process都相同,说明会话的os进程号与响应这两个会话的服务器进程的os进程号相同这两个session的status一个为活动的,一个为不活动的3.以kill session来做一点实验3.1.我会打开另外一个sqlplus用johnson建立连接(注意:是连接!不是会话!呵呵),并让它拥有两个会话做kill session实验查询v$session:sys@OCP10G> select saddr,sid,serial#,paddr,user#,username,process,server,status from v$session where username is not null;SADDR SID SERIAL# PADDR USER# USERNAME PROCESS SERVER STATUS-------- ---------- ---------- -------- ---------- ------------------------------ ------------ --------- --------6EDBCCEC 144 33 6ECF1864 0 SYS 2752:1860 DEDICATED ACTIVE6EDCFDDC 161 267 6ECF25E4 58 JOHNSON 3232:2652 DEDICATED INACTIVE3.2.在johnson窗口使用set autotrace on,回到sys窗口查询v$sessionsys@OCP10G> select saddr,sid,serial#,paddr,user#,username,process,server,status from v$session where username is not null;SADDR SID SERIAL# PADDR USER# USERNAME PROCESS SERVER STATUS-------- ---------- ---------- -------- ---------- ------------------------------ ------------ --------- --------6EDBCCEC 144 33 6ECF1864 0 SYS 2752:1860 DEDICATED ACTIVE6EDC269C 149 159 6ECF25E4 58 JOHNSON 3232:2652 DEDICATED INACTIVE6EDCFDDC 161 267 6ECF25E4 58 JOHNSON 3232:2652 DEDICATED INACTIVE可以看到johnson的两个session都是inactive状态,因为我在操作sys窗口...呵呵3.3.我们在sys窗口运行alter system kill session '149,159',看看发生什么情况sys@OCP10G> alter system kill session '149,159';系统已更改。切到johnson窗口执行查询select * from dual;可以看到autotrace以及半残疾了,因为autotrace相关的session被kill了~为什么不是全残??johnson@OCP10G> select * from dual;搜集统计信息时出错 ORA-28SP2-0612: 生成 AUTOTRACE 报告时出错D-XSP2-0612: 生成 AUTOTRACE 报告时出错执行计划---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=2 Card=1 Bytes=2) 1 0 TABLE ACCESS (FULL) OF 'DUAL' (TABLE) (Cost=2 Card=1 Bytes =2)SP2-0612: 生成 AUTOTRACE STATISTICS 报告时出错3.4.我们在sys窗口运行alter system kill session '161,267',看看发生什么情况sys@OCP10G> alter system kill session '161,267';系统已更改。切到johnson窗口执行查询select * from dual;可以看到会话已经被终止了johnson@OCP10G> select * from dual;select * from dual*第 1 行出现错误:ORA-00028: 您的会话己被终止结论:1.使用connect命令是创建一个连接,而不是创建一个session...2.kill命令用组合键'sid,serial#'是有道理滴下面显示一个连接中有0个会话的情况1.查询v$session发现有个johnson连接,paddr和process可以唯一确定一个连接,记住johnson的连接的paddr是6ECF25E4sys@OCP10G> select saddr,sid,serial#,paddr,user#,username,process,server,status from v$session where username is not null;SADDR SID SERIAL# PADDR USER# USERNAME PROCESS SERVER STATUS-------- ---------- ---------- -------- ---------- ------------------------------ ------------ --------- --------6EDBCCEC 144 33 6ECF1864 0 SYS 2752:1860 DEDICATED ACTIVE6EDBDEDC 145 190 6ECF25E4 58 JOHNSON 3964:3040 DEDICATED INACTIVE2.切到johnson界面执行disconnect(或在sys里用kill session在到johnson里执行select * from dual)johnson@OCP10G> disconnect;从 Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 - ProductionWith the Partitioning, OLAP and Data Mining options 断开3.回到sys,查询v$session,发现在v$session里johnson的连接没了,这是因为session没了,即session数为0了,那么johnson的连接还在吗?sys@OCP10G> select saddr,sid,serial#,paddr,user#,username,process,server,status from v$session where username is not null;SADDR SID SERIAL# PADDR USER# USERNAME PROCESS SERVER STATUS-------- ---------- ---------- -------- ---------- ------------------------------ ------------ --------- --------6EDBCCEC 144 33 6ECF1864 0 SYS 2752:1860 DEDICATED ACTIVE4.查询v$process,条件为addr='6ECF25E4'(第一步记住的paddr),发现其实这个连接还是存在的,即一个连接有0个session...sys@OCP10G> select username,program from v$process where addr='6ECF25E4';USERNAME PROGRAM--------------- ----------------------------------------------------------------SYSTEM ORACLE.EXE (SHAD)注:这里就存在着session没了但连接还在的情况,还是占有一定的系统资源,所以kill session并不能kill掉连接5.到johnson下执行quit(或exit),只有这样才能断开连接johnson@OCP10G> quitsys@OCP10G> select username,program from v$process where addr='6ECF25E4';未选定行
oracle保持会话连接,oracle中连接与会话
最新推荐文章于 2023-05-14 13:25:23 发布