Oracle建立连接的过程分析
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建立连接的两种方式之间的交互方式:
Oracle建立连接的过程分析的更多相关文章
- jdbc 和oracle数据库 建立连接
package jdbc; import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException; ...
- Linux SSH建立连接过程分析
https://blog.csdn.net/qwertyupoiuytr/article/details/71213463 SSH建立连接的过程主要分为下面几个阶段: SSH协议版本协商阶段.SSH目 ...
- ORACLE会话连接进程三者总结
概念介绍 通俗来讲,会话(Session) 是通信双方从开始通信到通信结束期间的一个上下文(Context).这个上下文是一段位于服务器端的内存:记录了本次连接的客户端机器.通过哪个应用程序.哪个用户 ...
- oracle远程连接配置
今日需要对站内所有的空间数据做入库处理,所以在服务器上安装了oracle,在本地需要对其进行连接,在网上查阅了相关资料,整理如下: 远程服务端配置:1. 数据库配置 因为要为外界客户端提供数据服 ...
- ArcGis设置到 Oracle 的连接
设置到 Oracle 的连接 地理数据 » 管理地理数据库 » Oracle 中的地理数据库 要建立从客户端计算机到 Oracle 数据库的连接,必须在客户端计算机上安装 Oracle 客户端应用程序 ...
- Sql server2012连接Sql server 2008时出现的问题:已成功与服务器建立连接,但在登陆过程中发生错误。(provider:SSL Provider,error:0-接收到的消息异常,或格式不正确。)
以前连接是正常的,就这两天连不上了.(没有耐心的直接看末尾解决办法) 错误消息如下: 1.尝试读取或写入受保护的内存.这通常指示其他内存已损坏.(System.Data) 2.已成功与服务器建立连接, ...
- Oracle 表连接方式分析 .
一 引言 数据仓库技术是目前已知的比较成熟和被广泛采用的解决方案,用于整和电信运营企业内部所有分散的原始业务数据,并通过便捷有效的数据访问手段,可以支持企业内部不同部门,不同需求,不同层次的用户随时获 ...
- 理解oracle中连接和会话
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp44 理解oracle中连接和会话 1. 概念不同:概念不同: 连接是指物 ...
- vs 或 Sql server2012连接Sql server时出现的问题:已成功与服务器建立连接,但在登陆过程中发生错误
以前连接是正常的,就这两天连不上了.(没有耐心的直接看末尾解决办法) 错误消息如下: 1.尝试读取或写入受保护的内存.这通常指示其他内存已损坏.(System.Data) 2.已成功与服务器建立连接, ...
随机推荐
- 字符串反转(java和js)
写在前面 关于字符串反转的奇技淫巧很多, 会一种就行了, 但是解锁更多姿势可谓艺多不压身啊~~ 正文 java https://www.cnblogs.com/binye-typing/p/92609 ...
- Schema注册表客户端
Schema注册表客户端 与模式注册表服务器交互的客户端抽象是SchemaRegistryClient接口,具有以下结构: public interface SchemaRegistryClient ...
- dd命令笔记
dd命令 用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换 参数 if=FILE 指定输入源文件, 缺省为标准输入, < if=input file > iflag=FLAGS 指 ...
- JS实现统一社会信用代码的效验(组织机构代码效验)
参考原文https://blog.csdn.net/hdhxby/article/details/56015370 部分错误,修改整合了下 想查询数据的,请点击:统一信用代码查询地址 查看效验规则点击 ...
- Python3基础 is与== 区别
Python : 3.7.3 OS : Ubuntu 18.04.2 LTS IDE : pycharm-community-2019.1.3 ...
- OpenShift 4.2 添加RHEL节点
OpenShift 4.2版本下如何加入RHEL 7.6的节点. 部署架构图 1.worker3所在的物理机 建立一个helper-woker03.cfg文件用于节点虚机的建立和启动,注意namese ...
- java https post请求并忽略证书,参数放在body中
1 新建java类,作用是绕过证书用 package cn.smartercampus.core.util; import java.security.cert.CertificateExceptio ...
- Python窗体操作函数
实现了一个window下对窗体操作的类,实现的功能如:移动窗体.获取窗体位置和大小.截取窗体图片.坐标转换等. 直接上代码: # coding=utf-8 import win32con import ...
- 20190726_安装CentOS7minimal版本后需要做的优化和配置
20190726_安装CentOS7minimal版本后需要做的优化和配置 CentOS系统镜像下载地址:https://www.centos.org/ CentOS的Minimal(最小化安装版本) ...
- FastReport For Delphi7 通用安装方法
安装前请册除原有的FR控件. 1. "Tools|Environmet options..."中的"Library"标签面下"Library path ...