日期:2014-05-16 浏览次数:20395 次
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帐号登录过。
?
?
?
?