Oracle中连接与会话的区别

本文解析了Oracle数据库中连接与会话的概念及其差异。连接指客户端与数据库实例间通信通道,而会话则指用户与数据库交互的过程。一个连接可以支持多个独立的会话,每个会话都有独立的内存数据结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.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/bystander1983/blog/item/7201a3835d1961ab0cf4d294.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,status
from v$session
where username=USER
/
USERNAME SID SERIAL#SERVER PADDR STATUS
----------- --- ------ ------ ------------ -----
OPS$TKYTE 153  3196  DEDICATED AE4CF614 ACTIVE

其中,user是系统函数,结果为当前连接数据库的用户。目前结果显示的是一个单独连接专用服务器的会话。PADDR列是唯一的专用服务器进程的地址。
其次,打开autotrace,来查看在SQL*Plus中执行语句的统计数据。

SQL>set autotrace on statistics
SQL>select username,sid,serial#,server,paddr,status
from v$session
where 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视图。

### 查询 Oracle 数据库中的当前连接会话信息 在 Oracle 数据库中,可以通过访问动态性能视图 `v$session` 来获取当前的连接会话信息。以下是几种常见的查询方法及其对应的 SQL 语句: #### 1. 获取总的会话数量 通过统计 `v$session` 表中的记录总数来获得当前数据库中存在的所有会话的数量。 ```sql SELECT COUNT(*) AS total_sessions FROM v$session; ``` 此查询返回的结果表示整个数据库实例中的总会话数[^3]。 #### 2. 获取活动状态下的会话数量 如果仅关注处于活跃状态(即正在执行某些操作)的会话,则可以过滤 `status='ACTIVE'` 的记录。 ```sql SELECT COUNT(*) AS active_sessions FROM v$session WHERE status = 'ACTIVE'; ``` 该查询能够帮助管理员了解系统的负载情况以及有多少并发请求正在进行处理[^5]。 #### 3. 列出会话的具体详情 为了更深入地分析各个用户连接行为或者定位某个具体的客户端程序所引发的问题,可进一步扩展查询条件以显示更多字段信息,如 SID、SERIAL#、用户名 (USERNAME)、应用程序名称(PROGRAM),以及发起这些请求的工作站地址(MACHINE)等属性。 ```sql SELECT SID, SERIAL#, USERNAME, PROGRAM, MACHINE, STATUS FROM v$session; ``` 上述脚本提供了全面的数据集以便于诊断潜在瓶颈所在位置。 #### 4. 结合进程信息一起展示 有时候还需要知道每一个 session 对应的操作系统级别上的 process id ,这时就需要联合另一个重要的视图表——`v$process` 进行关联查询: ```sql SELECT s.SID, s.SERIAL#, s.USERNAME, p.spid OS_PID FROM v$session s JOIN v$process p ON s.paddr = p.addr; ``` 这里利用了两个表之间的关系:`paddr`(Process Address) 是指针指向实际物理内存空间里存储着对应 Process Instance 地址的位置;而后者则保存有操作系统分配给它的唯一标识符 SPID(System Process ID)[^2]。 综上所述,在日常运维工作中掌握以上几类基础查询方式对于有效管理维护 Oracle Database 至关重要。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值