Oracle的连接与会话

连接并不是会话的同义词,在一条连接上可以建立0个、一个或多个会话。各个会话是单独而且独立的,即使它们共享同一条数据库物理连接也是如此。一个会话中的提交不会影响该连接上的任何其他会话。实际上,一条连接上的各个会话可以使用不同的用户身份!

在Oracle中,连接只是客户进程和数据库实例之间的一条特殊线路,最常见的就是网络连接。这条连接可能连接到一个专用服务器进程,也可能连接到调度程序。如前所述,连接上可以有0个或多个会话,这说明可以有连接而无相应的会话。另外 ,一个会话可以有连接也可以没有连接。使用高级Oracle Net特性(如连接池)时,客户可以删除一条物理连接,而会话依然保留(但是会话会空闲)。客户在这个会话执行某个操作时,它会重新建立物理连接。

连接(connection):连接是从客户到Oracle实例的一条物理路径。连接可以在网络上建立或通过IPC机制建立。通常会在客户进程与一个专用服务器或一个调度程序之间建立连接。不过,如果使用Oracle的连接管理器(Connection
Manager,CMAN),还可以在客户和CMAN之间以及CMAN和数据库之间建立连接。

会话(session):会话是实例中存在的一个逻辑实体。这就是会话状态(session state),也就是表示特定会话的一组内存中的数据结构。提到“数据库连接”时,大多数人首先想到的就是“会话”。你要在服务器中的会话上执行SQL、提交事务或运行存储过程。

可以使用SQL*Plus来看一看实际连接和会话是什么样子,还可以了解到,实际上一条连接有多个会话的情况相当常见。这个使用AUTOTRACE命令,进行测试。

这说明现在有一个会话:这是一个与单一专用服务器连接的会话。以上PADDR列是这个专用服务器进程的地址。下面,只需打开AUTOTRACE来查看SQL*Plus中所执行语句的统计结果:

这样一来,我们就有了两个会话,但是这两个会话都使用同一个专用服务器进程,从它们都有同样的PADDR值就能看出这一点。从操作系统也可以得到确认,因为没有创建新的进程,对这两个会话使用了一个进程(一条连接)。需要注意,其中一个会话(原来的会话)是ACTIVE(活动的)。这是有道理的:它正在运行查询来显示这个信息,所以它当然是活动的。但是这个INACTIVE(不活动的)会话呢?那个会话要做什么?这就是AUTOTRACE会话,它的任务是“监视”我们的实际会话,并报告它做了什么。

在SQL*Plus中启用(打开)AUTOTRACE时,如果我们执行DML操作(INSERT、UPDATE、DELETE、SELECT和MERGE),SQL*Plus会完成以下动作:

(1)如果还不存在辅助会话,它会使用当前连接创建一个新会话。

(2)要求这个新会话查询V$SESSATE视图来记住实际会话(即运行DML的会话)的初始统计值。

(3)在原会话中运行DML操作。

(4)DML语句执行结束后,SQL*Plus会请求另外那个会话(即“监视”会话)再次查询V$SESSTAT,并生成前面所示的报告,显示出原会话(执行DML的会话)的统计结果之差。

如果关闭AUTOTRACE,SQL*Plus会终止这个额外的会话,在V$SESSION中将无法看到这个会话。之所以要另建一个额外的会话,原因是:如果在同一个会话中观察统计结果,就会造成影响,因为执行监视本身也要使用内存、I/O,网络上传输字节以及执行排序。所以需要使用另一个会话来正确测量。

到目前为止,我们已经看到一条连接可以有一个或两个会话。现在,我们使用SQL*Plus来查看一条没有任何会话的连接。只需要键入一个“很容易误解”的命令DISCONNECT:

从技术上讲,这个命令应该叫DESTROY_ALL_SESSIONS更合适,而不是DISCONNECT,因为我们并没有真正物理的断开连接。要真正的断开连接,应该执行exit命令。

使用另一个用户打开另一个会话,查询原来账户名的会话:

可以看到,这个账户名下没有会话,但是仍有一个进程,相应地有一条物理连接(使用前面的ADDR值):

所以,这就有了一条没有相关会话的“连接”。可以使用CONNECT命令(这个命令的名字也起得不恰当),在这个现有的进程中创建一个新的会话(CONNECT命令叫CREATE_SESSION更合适)。使用取消连接的SQL*Plus,执行以下内容:

可以注意到,PADDR还是一样的,所以我们还是使用同一条物理连接,但是(可能)有一个不同的SID。说“有可能”是因为也许还会分配同样的SID,这取决于我们注销时是否有别人登录,以及我们原来的SID是否可用。

参考《9I10G11G编程艺术  深入数据库体系结构》

时间: 2024-10-10 08:29:54

Oracle的连接与会话的相关文章

oracle调优 浅析“会话管理开销”

调优之浅析"会话管理开销" [简介] 在调优的过程中,对于会话的管理是比较普遍的问题,因为维护会话的开销相对是比较高的. [过程表现如下] 客户请求(sid)→监听接收到→监听派生出新的进程(systemprocess id)→客户进程 注释: SPID:system process id,表示该serverprocess在OS层面的Process ID(操作系统进程ID); PID:oracle process id,可以理解为Oracle自身使用的进程ID; SID:session

连接、会话

通俗来讲,会话(Session) 是通信双方从开始通信到通信结束期间的一个上下文(Context).这个上下文是一段位于服务器端的内存:记录了本次连接的客户端机器.通过哪个应用程序.哪个用户登录等信息. 连接(Connection):连接是从客户端到ORACLE实例的一条物理路径.连接可以在网络上建立,或者在本机通过IPC机制建立.通常会在客户端进程与一个专用服务器或一个调度器之间建立连接. 会话(Session) 是和连接(Connection)是同时建立的,两者是对同一件事情不同层次的描述.

Oracle Table连接方式分析

Oracle Table连接方式分析 表连接基本知识: 1.哪张表将驱动查询(即访问的第一张表)?按照指定的路径查询,何时将访问到没一张表?可选的驱动路径有哪些? 2.可能出现哪些Oracle连接?记住:在Oracle中,连接顺序.可选的索引.用于排序和建立散列表的可用内存的不同都会导致不同的结果. 3.哪些索引是可用的?哪些索引是可选的?索引的选择不仅仅将导致优化器使用或者限制一个索引,还将改变驱动查询的方式,并可能决定使用或者限制查询中其他的索引. 4.哪些提示提供了可选的路径?哪些提示限制

Oracle左连接、右连接、全外连接以及(+)号用法(转)

Oracle  外连接(OUTER JOIN) 左外连接(左边的表不加限制) 右外连接(右边的表不加限制) 全外连接(左右两表都不加限制) 对应SQL:LEFT/RIGHT/FULL OUTER JOIN. 通常省略OUTER关键字, 写成:LEFT/RIGHT/FULL JOIN. 在左连接和右连接时都会以一张A表为基础表,该表的内容会全部显示,然后加上A表和B表匹配的内容. 如果A表的数据在B表中没有记录. 那么在相关联的结果集行中列显示为空值(NULL). 对于外连接, 也可以使用“(+)

西安北大青鸟探寻oracle的连接问题

今天在为学生讲述西安java培训用scott用户登录oracle数据库时,竟然出现了ORA-01017: invalid username/password; logon denied错误,原以为是因为我的scott用户没有解锁,后用system用户登录,然后用alter user scott account unlock语句对scott用户进行解锁,可是解锁后依然不能进入,还是报告ORA-01017: invalid username/password; logon denied错误,仔细想了

Oracle左连接、右连接、全外连接以及(+)号用法

阅读目录 1.准备工作 2.左外连接(LEFT OUTER JOIN/ LEFT JOIN) 3.右外连接(RIGHT OUTER JOIN/RIGHT JOIN) 4.全外连接(FULL OUTER JOIN/FULL JOIN) 1.准备工作 Oracle  外连接(OUTER JOIN)包括以下: 左外连接(左边的表不加限制) 右外连接(右边的表不加限制) 全外连接(左右两表都不加限制) 对应SQL:LEFT/RIGHT/FULL OUTER JOIN. 通常省略OUTER关键字, 写成:

Oracle字符串连接的方法

Oracle数据库中,使用“||”进行字符串连接,下面就让我们一起了解一下Oracle数据库中字符串连接的方法,希望对您能有所帮助. 和其他数据库系统类似,Oracle字符串连接使用“||”进行字符串拼接,其使用方式和MSSQLServer中的加号“+”一样. 比如执行下面的SQL语句:SELECT '工号为'||FNumber||'的员工姓名为'||FName FROM T_EmployeeWHERE FName IS NOT NULL 除了“||”,Oracle还支持使用CONCAT()函数

Oracle远程连接

Oracle远程连接不是直接使用Ip加端口 这种形式,而是使用TNS(个人感觉和ODBC的DSN有点类似,在某个地方保存一些设置,然后给这些设置起个名字,用的时候直接写这个名字就行了) TNS目录位置: 安装目录\Network\Admin\tnsnames.ora ORCL32 = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICA

oracle表连接

oracle表连接又被问到了,感觉细节了解还是远远不够啊,从网上找资料学习之.转载的. 在查看sql执行计划时,我们会发现表的连接方式有多种,本文对表的连接方式进行介绍以便更好看懂执行计划和理解sql执行原理. 一.连接方式:         嵌套循环(Nested  Loops (NL))       (散列)哈希连接(Hash Join (HJ))     (归并)排序合并连接(Sort Merge Join (SMJ) ) 二.连接说明:     1.Oracle一次只能连接两个表.不管查