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是新生成的;
那么,在共享模式下,我们研究的又是如何呢??