ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 小议服务进程与会话(二)

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

原创 Linux操作系统 作者:realkid4 时间:2011-01-12 00:14:28 0 删除 编辑

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';

 

SID    SERIAL# PADDR  USER# USERNAME      MACHINE  ACTION

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

33      10    38BC4C0C       0       SYS      {本机名}   Main session

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

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

 

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

 

查看v$process,可以发现。

//篇幅原因,简写

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

 

ADDR            PID SPID                   

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

38BC4C0C         22 5730                     

38BC56E4         23 5734          

 

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

 

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

 

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

……(篇幅原因,省略)

oracle    5720     1  0 10:41 ?        00:00:00 ora_w000_wilson

oracle    5730     1  1 10:42 ?        00:00:02 oraclewilson (LOCAL=NO)

oracle    5734     1  0 10:42 ?        00:00:00 oraclewilson (LOCAL=NO)

oracle    5747  5515  0 10:45 pts/0    00:00:00 ps -ef

oracle    5748  5515  0 10:45 pts/0    00: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';

 

SID        PADDR           USERNAME   MACHINE           ACTION

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

33         38BC4C0C         SYS        {本机}          Main session

37         38BC56E4         SYS         {本机}          Command Window - New

39         38BC61BC        SYS         {本机}          Command Window – New

 

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

 

SQL> select * from v$process;

//有省略结果

ADDR            PID SPID  

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

38BC4C0C         22 5730   

38BC56E4         23 5734   

38BC61BC         24 5756   

 

 

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

 

操作系统层面。

 

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

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

oracle    5730     1  0 10:42 ?        00:00:02 oraclewilson (LOCAL=NO)

oracle    5734     1  0 10:42 ?        00:00:00 oraclewilson (LOCAL=NO)

oracle    5756     1  0 10:46 ?        00:00:00 oraclewilson (LOCAL=NO)

oracle    5762  5515  0 10:47 pts/0    00:00:00 grep ora

 

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

 

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

 

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

 

       SID    SERIAL# PADDR      MACHINE                      ACTION

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

        28         71 38BC56E4   WORKGROUP\WWW-0E6111DFF74  //观察进程

        33         10 38BC4C0C   WORKGROUP\WWW-0E6111DFF74    Main session

 

 

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

 

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

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

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

oracle    5791     1  0 10:51 ?        00:00:00 ora_w000_wilson

oracle    5809     1  0 10:55 ?        00:00:00 oraclewilson (LOCAL=NO)

oracle    5821     1  9 10:58 ?        00:00:00 ora_j000_wilson

oracle    5823     1  0 10:58 ?        00:00:00 ora_j001_wilson

oracle    5824  5515  0 10:58 pts/0    00:00:00 ps -ef

oracle    5825  5515  0 10:58 pts/0    00:00:00 grep ora

 

 

当关闭developer之后,

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

…(有省略)

oracle    5676     1  0 10:36 ?        00:00:00 ora_q001_wilson

oracle    5718     1  0 10:41 ?        00:00:00 ora_smco_wilson

oracle    5791     1  0 10:51 ?        00:00:00 ora_w000_wilson

oracle    5826  5515  1 10:58 pts/0    00:00:00 ps -ef

oracle    5827  5515  0 10:58 pts/0    00: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是新生成的;

 

 

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

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/17203031/viewspace-683640/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
求道~

注册时间:2010-11-30

  • 博文量
    545
  • 访问量
    8041224