oracle中连接与会话

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 ACTIVE

2.把autotrace设置为on,再次查询v$session
sys@OCP10G> set autotrace on
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 ACTIVE
6EDC269C        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 ACTIVE
6EDCFDDC        161        267 6ECF25E4         58 JOHNSON                        3232:2652    DEDICATED INACTIVE

3.2.在johnson窗口使用set autotrace on,回到sys窗口查询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 ACTIVE
6EDC269C        149        159 6ECF25E4         58 JOHNSON                        3232:2652    DEDICATED INACTIVE
6EDCFDDC        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-28
SP2-0612: 生成 AUTOTRACE 报告时出错

D
-
X

SP2-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是6ECF25E4
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 ACTIVE
6EDBDEDC        145        190 6ECF25E4         58 JOHNSON                        3964:3040    DEDICATED INACTIVE
2.切到johnson界面执行disconnect(或在sys里用kill session在到johnson里执行select * from dual)
johnson@OCP10G> disconnect;
从 Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 - Production
With 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 ACTIVE
4.查询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> quit
sys@OCP10G> select username,program from v$process where addr='6ECF25E4';
未选定行
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值