Oracle建⽴连接的过程分析
Oracle建⽴连接的过程
如果我们想登陆数据库并在数据库中真正做事情,就必须先建⽴连接,⾸先我会介绍如何建⽴连接,再介绍建⽴连接的两种⽅式的原理,以及建⽴连接的过程中在客户端和服务端都做了些什么。
如何连接到数据库
客户端和服务端主要是通过TCP/IP协议建⽴连接的。对于服务端⽽⾔,服务端在连接过程中主要关⼼的是怎么处理请求的问题,Oracle服务器端⼀定会在固定的地址上启动⼀个⽤于专门处理连接请求的进程或者是线程。
对于客户端⽽⾔我们需要知道服务端的IP地址,的端⼝以及服务名,并率先发起请求。
如果在$ORACLE_HOME/network/admin⽬录下的配置⽂件a中配置了数据库的TNS连接字符串如下:
MUPHY =
(DESCREPTION =如何连接oracle数据库
(ADDRESS = (PROTOCOL = TCP)(HOST = = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = muphy)
)
)
那么我们就可以按照下⾯的语法连接到数据库:
$ sqlplus eoda/foo@muphy
如果我们知道数据库主机是127.0.0.1,端⼝是1521,服务名是muphy,那么可以直接在终端中输⼊按照下⾯的语法连接到数据库:
$ sqlplus
这种简单的⽅式连接到数据库在某些情况⾮常有⽤,⽐如说连接问题的排错,或者⼿头没有可以使⽤的a,或者其他解析⽅式时。
专⽤服务器连接
当我们登陆数据库是,Oracle进程总会通过fork()或者exec()系统调⽤创建⼀个新进程(windows系统为线程),这个新的进程通常是专⽤服务器配置,继承了建⽴的连接,因为这个服务器进程会在会话⽣存期中专门为此会话访问,会话与专⽤服务器之间存在⼀对⼀的关系,如下图所⽰:
按照定义,专⽤服务器不是实例的⼀部分,客户端会与这个专⽤服务器直接通信,包括接收和处理客户端发来的SQL,如果必要的话,还会为客户端读取数据⽂件,在缓存中查需要的数据,运⾏PL/SQL代码等操作。
共享服务器连接
Oracle的另外⼀种连接⽅式是共享服务器,如果采⽤这种连接⽅式,数据库监视器就不会对每个⽤户连接创建新的线程或者进程。
在共享服务器中,Oracle使⽤⼀个“共享进程”池为多个⽤户提供服务,实际上就是⼀种连接池机制。利⽤共享服务器,我们不必为10000个数据库创建10000个进程,⽽只需要创建很少的进程,这些进程所
有会话共享,⼤⼤降低了服务器创建和维护进程的开销,能够处理更多的连接请求。
共享服务器与专⽤服务器之间有⼀个重⼤的区别:共享服务器不会与客户端直接通信,因为共享服务器进程是共享的,还需要另外⼀种机制才能与服务器通信,这种机制就是使⽤了⼀个或者⼀组调度程序的进程,监视器会⼀直在主机的某⼀设置好的端⼝上运⾏,⽽调度程序会在服务器上随意指派的端⼝上接收连接请求。
通过进程监控器进程PMON,监视器进程知道实例中运⾏了哪些调度程序以及调度程序的信息,监视器接收到客户端的共享服务器连接请求后,他会从调度程序中选择⼀个调度程序进程,并把这个进程的连接信息返回给客户端,其中说明了如何连接到这个调度程序,监视器返回
调度程序的连接信息后与客户端断开连接,监视器的⼯作到此结束。
客户端通过监视器返回的连接信息与调度程序通信,调度程序的进程将客户端的请求放⼊SGA中的请求队列,第⼀个空闲的共享服务器进程会处理这个请求,请求处理完后,共享服务器会把相应放在原调度程序的相应队列中,调度程序进程⼀直在监视这个队列,当它发现相应队列中有处理结果时,就把结果传给客户端。
共享服务器请求处理流程如下:
⽤⼀个图来总结客户端与Oracle建⽴连接的两种⽅式之间的交互⽅式:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。