设为首页 收藏本站
查看: 1799|回复: 0

[经验分享] Oracle的连接与会话

[复制链接]

尚未签到

发表于 2018-9-7 09:00:45 | 显示全部楼层 |阅读模式
  连接并不是会话的同义词,在一条连接上可以建立0个、一个或多个会话。各个会话是单独而且独立的,即使它们共享同一条数据库物理连接也是如此。一个会话中的提交不会影响该连接上的任何其他会话。实际上,一条连接上的各个会话可以使用不同的用户身份!
  在Oracle中,连接只是客户进程和数据库实例之间的一条特殊线路,最常见的就是网络连接。这条连接可能连接到一个专用服务器进程,也可能连接到调度程序。如前所述,连接上可以有0个或多个会话,这说明可以有连接而无相应的会话。另外 ,一个会话可以有连接也可以没有连接。使用高级Oracle Net特性(如连接池)时,客户可以删除一条物理连接,而会话依然保留(但是会话会空闲)。客户在这个会话执行某个操作时,它会重新建立物理连接。
  连接(connection):连接是从客户到Oracle实例的一条物理路径。连接可以在网络上建立或通过IPC机制建立。通常会在客户进程与一个专用服务器或一个调度程序之间建立连接。不过,如果使用Oracle的连接管理器(ConnectionManager,CMAN),还可以在客户和CMAN之间以及CMAN和数据库之间建立连接。
  会话(session):会话是实例中存在的一个逻辑实体。这就是会话状态(session state),也就是表示特定会话的一组内存中的数据结构。提到“数据库连接”时,大多数人首先想到的就是“会话”。你要在服务器中的会话上执行SQL、提交事务或运行存储过程。
  可以使用SQL*Plus来看一看实际连接和会话是什么样子,还可以了解到,实际上一条连接有多个会话的情况相当常见。这个使用AUTOTRACE命令,进行测试。
DSC0000.png

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

  这样一来,我们就有了两个会话,但是这两个会话都使用同一个专用服务器进程,从它们都有同样的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:
DSC0002.png

  从技术上讲,这个命令应该叫DESTROY_ALL_SESSIONS更合适,而不是DISCONNECT,因为我们并没有真正物理的断开连接。要真正的断开连接,应该执行exit命令。
使用另一个用户打开另一个会话,查询原来账户名的会话:
DSC0003.png

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

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

  可以注意到,PADDR还是一样的,所以我们还是使用同一条物理连接,但是(可能)有一个不同的SID。说“有可能”是因为也许还会分配同样的SID,这取决于我们注销时是否有别人登录,以及我们原来的SID是否可用。
  参考《9I10G11G编程艺术  深入数据库体系结构》


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-565511-1-1.html 上篇帖子: Oracle 数据库误truncate table恢复过程 下篇帖子: Oracle数据库的备份与恢复方式比较
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表