度量快速开发平台-专业、快速的软件定制快开平台

标题: Oracle中连接与会话的区别 [打印本页]

作者: fteair    时间: 2020-2-9 16:59
形容得很生动形象好理解
作者: 张兴康    时间: 2020-2-10 14:05
fteair 发表于 2017-3-9 16:59
形容得很生动形象好理解


作者: 张兴康    时间: 2020-7-24 12:57
标题: Oracle中连接与会话的区别
连接 (connection)与会话 (session)这两个概念均与用户进程 (user process)紧密相关,但二者又具有不同的含义。
连接 :用户进程和 Oracle 实例间的通信通道(communication pathway)。这个通信通道是通过进程间的通信机制(interprocess communication mechanisms)(在同一个计算机上运行用户进程和 Oracle 进程)或网络软件(network software)(当数据库应用程序与 Oracle 服务器运行在不同的计算机上时,就需要通过网络来通信)建立的。
会话 :用户通过用户进程与 Oracle 实例建立的连接[此处连接与上文中的连接含义不同 ,主要指用户和数据库间的联系 ]。例如,当用户启动 SQL*Plus 时必须提供有效的用户名和密码,之后 Oracle 为此用户建立一个会话。从用户开始连接到用户断开连接(或退出数据库应用程序)期间,会话一直持续。
Oracle 数据库中的同一个用户可以同时创建多个会话。例如,用户名/密码为的SCOTT/TIGER 用户可以多次连接到同一个 Oracle 实例。
当系统没有运行在共享服务模式下时,Oracle 为每个用户会话创建一个服务进程(server process)。而当系统运行在共享服务模式下时,多个用户会话可以共享同一个服务进程。
2.通过实例理解(备注此实力来源于http://hi.baidu.com/bystander198 ... 1961ab0cf4d294.html
有A/B两个城市,需要从A运送白菜 到B城

先建一条公路
然后运送白菜过去,包括准备白菜和运送白菜以及返回等一系列的动作。

一条公路,可以运送0-n次的白菜
当然从A到B的公路也可能不只一条
某一次运送白菜,可以在真正上路时才开通某一条道路
一次运送不会影响别的运送的状态


对应数据库
A代表客户端进程
B代表服务器端进程
公路代表连接
运送一次白菜代表一个会话

一个连接可以进行多次的会话
一个会话可以不依赖于某个连接,甚至没有连接(当我准备好了,真正开始运送时再建立连接)
一个会话不会影响别的会话
3 来源于(http://book.51cto.com/art/200707/51921.htm
连接并不是会话的同义词。一个连接可能有零个、一个或多个建立在其上的会话。每个会话是分开且独立的,即使他们共享一个同样的物理连接到数据库。会话中的某个提交并不影响在该连接上的任何其他会话。事实上,使用该连接的每个会话可以使用不同用户身份。在Oracle中,一个连接是一个在客户端进程与数据库实例之间的物理线路——网络连接。该连接可能是一个专用服务器进程或一个调度进程。一个连接可以有零个或更多的会话,即一个连接的存在并不一定伴随着对应的会话存在。另外,一个会话不一定有连接。一个物理连接可以被客户端删除,只保留一个空闲会话。当客户端要在该会话中完成一些操作时,就需要重新建立物理连接。
?  •连接:一个连接是一个从客户端到一个数据库实例的物理通道。一个连接或者通过网络或者通过IPC机制建立连接。最典型的连接是建立在客户端进程和专用服务器或共享服务器之间。然而,使用Oracle的连接管理器(CMAN)时,一个连接可以是在客户端与CMAN之间或CMAN与数据库之间。
?  •会话:一个会话是存在于实例中的逻辑实体。它是一个表示唯一会话的内存数据结构的集合,用于执行SQL、提交事务并运行服务器中存储过程等。
实际上,一个连接有多个会话是非常普遍的。使用SQL*Plus可以说明连接和会话间的区别。使用autotrace命令时可产生两个会话。通过一个使用单个进程的连接也可以建立两个会话。首先,执行以下操作。
SQL>select username,sid,serial#,server,paddr,statusfrom v$sessionwhere username=USER/USERNAME SID SERIAL#SERVER PADDR STATUS----------- --- ------ ------ ------------ -----OPS$TKYTE 153  3196  DEDICATED AE4CF614 ACTIVE
其中,user是系统函数,结果为当前连接数据库的用户。目前结果显示的是一个单独连接专用服务器的会话。PADDR列是唯一的专用服务器进程的地址。
其次,打开autotrace,来查看在SQL*Plus中执行语句的统计数据。
SQL>set autotrace on statisticsSQL>select username,sid,serial#,server,paddr,statusfrom v$sessionwhere username=USER/   
这样,就打开了两个会话,但是两者都使用一个专用服务器进程。查询结果显示它们都有相同的PADDR列值。因此,两个会话使用一个进程,即单个连接。注意,其中一个会话,即最初的会话(SQL*Plus),是处于主动(active)状态。该会话运行查询显示结果信息。但另外一个处于被动状态(inactive)的会话就是autotrace会话,其职责是监视第一个会话并报告该会话所做的一切。
在SQL*Plus中打开autotrace后,当执行DML操作(insert、update、delete、select和merge)时,SQL*Plus将完成下列操作。
1)如果第二个会话不存在,则使用当前连接创建一个新的会话。
2)SQL*Plus要求产生的新会话查询v$sesstat视图,为运行DML的会话记录初始统计数据。
3)在第一个会话中运行DML操作。
4)在完成DML语句后,SQL*Plus 将要求其他会话再次查询V$sesstat并产生显示执行DML会话在统计数据上的差异报告。
如果关闭autotrace,SQL*Plus将终止第二个会话并不再监视v$session视图。

作者: 张兴康    时间: 2020-7-24 12:58

作者: 张兴康    时间: 2020-7-24 12:58





欢迎光临 度量快速开发平台-专业、快速的软件定制快开平台 (http://bbs.delit.cn/) Powered by Discuz! X3.2