共计 2135 个字符,预计需要花费 6 分钟才能阅读完成。
连接并不是会话的同义词,在一条连接上可以建立 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 是否可用。
参考《Oracle Database 9i/10g/11g 编程艺术:深入数据库体系结构(第 2 版)PDF》下载见 http://www.linuxidc.com/Linux/2016-02/128078.htm
更多 Oracle 相关信息见Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12
本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-01/139268.htm