session 和connection的不同

session 和connection的不同

这里的不同,主要讨论dedicated server下的不同,为讨论shared server情况下的。参考资料是TOM的《oracle编程艺术9i,10g,11g》

 

一个connection可能没有session建立在上面,也可能有一个、甚至多个session建立在connection上,并且每个session都是分割开的、独立的,即使他们共享数据库的physical connection。一个connection中的某个session的提交动作不会影响到其他session。

在oracle中,connection是在用户进程和数据库实例中间的一个简单的物理回路-----也可以说是网络连接。这个connection可能是连接到dedicated server process或者连接到一个dispatcher。session可能建立在connection上,也可能不在connection上。在使用advanced Oracle Net features时,如connection pooling,物理connection可能被客户端丢弃,留下session未动,空闲状态。当客户端想在这个session中执行一些操作时,oracle会重建这个物理connection。

connection:是客户端到oracle实例的物理路径(在客户端进程和dedicated server 或dispatcher)。connection建立在network或者IPC 进程上。然而,如果使用Oracle的connection manager(CMAN),connection就可能建立在客户端和CMAN,CMAN和数据库间。注意:这里的connection是分两段的。一段是,客户端和CMAN,第二段是,CMAN和数据库间。

session:是存在于instance中的逻辑entity(存在、实体)。

 

使用SQL*Plus 来看看实际中的connection和session。通过AUTOTRACE命令来验证一个connection中可以有多个session。

 

这个sql显示当前系统中只有一个session:一个单一的dedicated server-connection session。PADDR列是dedicated server的进程号。下面打开AUTOTRACE。


 

这样就得到两个session,这两个都是用相同的dedicated server 进程,可见这两个session的PADDR的值是相同的。值得注意的是STATUS是ACTIVE的session,这个session就是执行上面那个sql的session。但是INACTIVE的session是哪个?它是AUTOTRACE session。AUTOTRACE的工作是监视用户的real session,并且给出real session的工作报告。

AUTOTRACE在SQL*Plus中被激活后,当用户自行DML操作(INSERT, DELETE, SELECT,MERGE)时,SQL*Plus会执行下面动作:

1,SQL*Plus会在当前的connection中创建一个新的session;

2,SQL*Plus会让这个新的session查询V$SESSTAT来得到执行DML操作的session的初始统计信息。

3,SQL*Plus在原始的session中执行DML操作

4,DML操作完成后,SQL*Plus会请求AUTOTRACE session再次查询V$SESSTAT,计算出执行DML操作的                session在执行DML操作前后的统计信息。

关闭AUTOTRACE后,SQL*Plus会关闭这个session,并且在V$SESSION中看不到这个session。oracle为何在同一个connection中新建一个session。因为,如果在额外的connection中建立一个session,那么AUTOTRAEC统计出的信息就不准确了。

 

 

以上是在一个connection中建立2个session。下面是使用SQL*Plus,来看看connection中没有session的情况。使用DISCONNECT命令即可。
  在一个窗口中执行disconnect

 

 

这个命令并没有物理关闭connection,但是关闭了所有的session。如果在另一个窗口中使用其他用户登录、查询。



 这里用u1登录,u1有dba权限。用u1用户去查询和SYS用户相关的session信息。结果可以发现,在disconnect之后,和SYS用户相关的session信息全部丢失。

 

下面接着查看之前SYS用户的session所在的connection是否还存在。这个connection的ADDR是 ‘2E3C2B84’



 

这里可以发现这个进程并未消失。

 

在以前的窗口重新连接SYS用户:connect /


可以看见重新连进来以后的ADDR还是‘2E3C2B84’,但是SID不一样了。这个SID和之前的不一样,是因为在SYS帐号disconnect期间,有其他人在别处使用SYS帐号登录过。

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值