首页 > Linux操作系统 > Linux操作系统 > 小议服务进程与会话(二)
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/ ,如需转载,请注明出处,否则将追究法律责任。