oracle会话进程 local,小议服务进程与会话(二)

PL/SQL Developer连接解析

PL/SQL Developer是我们常常使用的开发工具。这个工具同时可以打开多个窗口,每个窗口是一个独立的会话,那么其中的原理和过程是如何呢?我们一起来分析。

首先启动一个Develper程序,开启一个窗口。实现登录。

SQL> conn sys/sys@wilson as sysdba;

Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0

Connected as SYS

注意,此时只开启了一个窗口,可见的只有一个会话对象!!

SQL> select sid, serial#, paddr, user#, username, machine, action from v$session where username='SYS';

SIDSERIAL# PADDRUSER# USERNAMEMACHINEACTION

-------- ---------- ------------------------------ ----------------------------------------------------------------

33 10 38BC4C0C0 SYS{本机名}Main session

37 13 38BC56E40 SYS {本机名}Command Window - New

//说明:版式原因,将本机名简写;

出现了一些问题,我们只开启了一个窗口command window。但在会话视图中,我们却发现了两个会话。一个是command window,另一个是Main session。

查看v$process,可以发现。

//篇幅原因,简写

SQL> select * from v$process where pname is null;

ADDRPID SPID

-------- ---------- -------------------

38BC4C0C22 5730

38BC56E423 5734

两个会话,在v$process中对应的是两个process,分别的SPID为5730和5734。

那么,从Linux进程列表中,如何情况呢?

[oracle@oracle11g ~]$ ps -ef | grep ora

……(篇幅原因,省略)

oracle572010 10:41 ?00:00:00 ora_w000_wilson

oracle573011 10:42 ?00:00:02 oraclewilson (LOCAL=NO)

oracle573410 10:42 ?00:00:00 oraclewilson (LOCAL=NO)

oracle574755150 10:45 pts/000:00:00 ps -ef

oracle574855150 10:45 pts/000:00:00 grep ora

果然,存在PID为5730和5734的两个进程对应。

结论:当我们在Develper中,只开启一个窗口的时候,是有两个session存在的,并且与两个server process相对应。

当我们再开启一个command窗口(原有窗口不关闭)。

Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0

Connected as SYS

会话情况。

SQL> select sid, serial#, paddr, user#, username, machine, action from v$session where username='SYS';

SIDPADDR USERNAME MACHINEACTION

---------- ---------- -------- ---------- ------------------------

3338BC4C0CSYS{本机}Main session

3738BC56E4SYS{本机} Command Window - New

3938BC61BCSYS{本机} Command Window – New

增加了一个窗口,在会话层面上新增加了一个会话(SID=39)。此外,Process层面。

SQL> select * from v$process;

//有省略结果

ADDRPID SPID

---------- ------------------------------ ---------

38BC4C0C22 5730

38BC56E423 5734

38BC61BC24 5756

进程对应的地址,完全相同,说明有三个process与其对应。

操作系统层面。

[oracle@oracle11g ~]$ ps -ef | grep ora

……(篇幅原因,有省略结果)

oracle573010 10:42 ?00:00:02 oraclewilson (LOCAL=NO)

oracle573410 10:42 ?00:00:00 oraclewilson (LOCAL=NO)

oracle575610 10:46 ?00:00:00 oraclewilson (LOCAL=NO)

oracle576255150 10:47 pts/000:00:00 grep ora

结论:当新增加一个command窗口之后,是有一个新会话生成,同时一个新的server process出现与其对应。

这次我们关闭了所有的窗口,只保留一个空的Develper界面。

SQL> select sid, serial#, paddr,machine,action from v$session where username='SYS';

SIDSERIAL# PADDRMACHINEACTION

---------- ---------- -----------------------------------------------------------------------

2871 38BC56E4WORKGROUP\WWW-0E6111DFF74//观察进程

3310 38BC4C0CWORKGROUP\WWW-0E6111DFF74Main session

只有一个Main Session的界面存在。

[oracle@oracle11g ~]$ ps -ef | grep ora

。。。(篇幅原因,有省略)

oracle573010 10:42 ?00:00:02 oraclewilson (LOCAL=NO) //这个是Main Session对应的进程,因为PID编号一直保留为5730;

oracle579110 10:51 ?00:00:00 ora_w000_wilson

oracle580910 10:55 ?00:00:00 oraclewilson (LOCAL=NO)

oracle582119 10:58 ?00:00:00 ora_j000_wilson

oracle582310 10:58 ?00:00:00 ora_j001_wilson

oracle582455150 10:58 pts/000:00:00 ps -ef

oracle582555150 10:58 pts/000:00:00 grep ora

当关闭developer之后,

[oracle@oracle11g ~]$ ps -ef | grep ora

…(有省略)

oracle567610 10:36 ?00:00:00 ora_q001_wilson

oracle571810 10:41 ?00:00:00 ora_smco_wilson

oracle579110 10:51 ?00:00:00 ora_w000_wilson

oracle582655151 10:58 pts/000:00:00 ps -ef

oracle582755150 10:58 pts/000:00:00 grep ora

分析和结论:

在分析之前,我们先关注一个细节。当我们在Developer中打开窗口的时候,如果我们当前是已经登录的,是不需要再输入用户名和密码的。而在我们命令行的窗口头行,会有如下信息:

Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0

Connected as SYS

细心的朋友们会意识到,这段提示实际上是我们新连接到一个Oracle实例的时候,会出现的信息。说明我们在新开一个窗口的时候,虽然没有输入用户名信息,但是还是算一次登录。那么问题来了,究竟是谁在什么时候替我们输入了呢?

第二个细节,每个Developer程序,只能是一个用户在登录。比如,我打开5个command窗口,只要我在一个窗口中重新登录。那么其他所有的窗口的用户信息都是被刷新为新的用户,当然,会话也全部为新的。

结论:毕竟我们不是Developer的开发者,只能依据事实进行合理猜测。

1、Developer主程序,实际上是一个Main Session的Oracle连接。只要Developer不是在nologing的状态,就会有一个会话与数据库服务器相连。这个会话像一个火种,保存着当前Developer的登录用户信息。在专有连接模式下,这个Main Session也是有Server Process与其连接;

2、当我们新建立一个窗口的时候,Developer会利用Main Session的信息,自动完成与监听器沟通、连接重定向和与新Server Process沟通的作用。让我们新开启一个窗口,不需要做任何额外的工作。本质上,一个窗口,就对应的一个会话。专有模式下,也就对应的一个Server Process;

3、当我们在任何一个窗口中重新登录的时候,Developer会将这个连接信息(连接用户、密码和连接服务名)作为Main Session的一个替代品,替代Main Session原有的信息。并且为每一个窗口,重新建立会话,形成与Server Process的通信。在专有模式下,对应的Server Process是新生成的;

那么,在共享模式下,我们研究的又是如何呢??

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值