首页 > 技术文章 > Oracle建立连接的过程分析

muphy 2019-05-19 18:01 原文

Oracle建立连接的过程

如果我们想登陆数据库并在数据库中真正做事情,就必须先建立连接,首先我会介绍如何建立连接,再介绍建立连接的两种方式的原理,以及建立连接的过程中在客户端和服务端都做了些什么。

如何连接到数据库

客户端和服务端主要是通过TCP/IP协议建立连接的。对于服务端而言,服务端在连接过程中主要关心的是怎么处理请求的问题,Oracle服务器端一定会在固定的地址上启动一个监听器用于专门处理连接请求的进程或者是线程。

对于客户端而言我们需要知道服务端的IP地址,监听器的端口以及服务名,并率先发起请求。

如果在$ORACLE_HOME/network/admin目录下的配置文件tnsnames.ora中配置了数据库的TNS连接字符串如下:

MUPHY =

       (DESCREPTION =

              (ADDRESS = (PROTOCOL = TCP)(HOST = www.muphy.me)(PORT = 1521))

              (CONNECT_DATA =

                     (SERVER = DEDICATED)

                     (SERVICE_NAME = muphy)

              )

)

那么我们就可以按照下面的语法连接到数据库:

$ sqlplus eoda/foo@muphy

如果我们知道数据库主机是127.0.0.1,端口是1521,服务名是muphy,那么可以直接在终端中输入按照下面的语法连接到数据库:

$ sqlplus eoda/foo@127.0.0.1:1521@muphy

这种简单的方式连接到数据库在某些情况非常有用,比如说连接问题的排错,或者手头没有可以使用的tnsnames.ora,或者其他解析方式时。

专用服务器连接

当我们登陆数据库是,Oracle监听器进程总会通过fork()或者exec()系统调用创建一个新进程(windows系统为线程),这个新的进程通常是专用服务器配置,继承了监听器建立的连接,因为这个服务器进程会在会话生存期中专门为此会话访问,会话与专用服务器之间存在一对一的关系,如下图所示:

 

按照定义,专用服务器不是实例的一部分,客户端会与这个专用服务器直接通信,包括接收和处理客户端发来的SQL,如果必要的话,还会为客户端读取数据文件,在缓存中查找需要的数据,运行PL/SQL代码等操作。

共享服务器连接

Oracle的另外一种连接方式是共享服务器,如果采用这种连接方式,数据库监视器就不会对每个用户连接创建新的线程或者进程。

在共享服务器中,Oracle使用一个“共享进程”池为多个用户提供服务,实际上就是一种连接池机制。利用共享服务器,我们不必为10000个数据库创建10000个进程,而只需要创建很少的进程,这些进程所有会话共享,大大降低了服务器创建和维护进程的开销,能够处理更多的连接请求。

共享服务器与专用服务器之间有一个重大的区别:共享服务器不会与客户端直接通信,因为共享服务器进程是共享的,还需要另外一种机制才能与服务器通信,这种机制就是使用了一个或者一组调度程序的进程,监视器会一直在主机的某一设置好的端口上运行,而调度程序会在服务器上随意指派的端口上接收连接请求。

通过进程监控器进程PMON,监视器进程知道实例中运行了哪些调度程序以及调度程序的信息,监视器接收到客户端的共享服务器连接请求后,他会从调度程序中选择一个调度程序进程,并把这个进程的连接信息返回给客户端,其中说明了如何连接到这个调度程序,监视器返回调度程序的连接信息后与客户端断开连接,监视器的工作到此结束。

客户端通过监视器返回的连接信息与调度程序通信,调度程序的进程将客户端的请求放入SGA中的请求队列,第一个空闲的共享服务器进程会处理这个请求,请求处理完后,共享服务器会把相应放在原调度程序的相应队列中,调度程序进程一直在监视这个队列,当它发现相应队列中有处理结果时,就把结果传给客户端。

共享服务器请求处理流程如下:

 

用一个图来总结客户端与Oracle建立连接的两种方式之间的交互方式:

 

推荐阅读