oracle客户端与服务端的连接

2023-10-29

author:skate

time:2010-08-16


oracle客户端与服务端的连接,参考如下:

http://blog.csdn.net/wyzxg/archive/2010/08/16/5815335.aspx

oracle服务进程如何处理用户进程的请求,参考如下:

http://blog.csdn.net/wyzxg/archive/2010/09/01/5855930.aspx

 

 

要想登录数据库并在数据库中真正做事情,一定要先连接数据库,根据连接的原理不同,分为专用服务器连接(dedicated server)和共享服务器连接(shared server)。TCP/IP是网络上连接Oracle所用的主要网络协议

 

什么是专用服务器?

 

在登录oracle时,Oracle总会为我创建一个新的进程。这通常称为专用服务器配置,因为这个服务器进程会在我的会话生存期中专门为我服务。对于每个会话,都会出现一个新的专用服务器,会话与专用服务器之间存在一对一的映射。按照定义,这个专用服务器不是实例的一部分。我的客户进程(也就是想要连接数据库的程序)会通过某种网络通道(如TCP/IP socket)与这个专用服务器直接通信,并由这个服务器进程接收和执行我的SQL。如果必要,它会读取数据文件,并在数据库的缓存中查找我要的数据。也许它会完成我的更新语句,也可能会运行我的PL/SQL代码。这个服务器进程的主要目标就是对我提交的SQL调用做出响应。

 

什么是共享服务器?

 

Oracle还可以接受另一种方式的连接,这称为共享服务器(shared server),正式的说法是多线程服务器(Multi-ThreadedServer)或MTS。如果采用这种方式,就不会对每条用户连接创建另外的线程或新的UNIX进程。在共享服务器中,Oracle使用一个“共享进程”池为大量用户提供服务。共享服务器实际上就是一种连接池机制(例如程序的连接池)。利用共享服务器,我们不必为10000个数据库会话创建10000个专用服务器(这样进程或线程就太多了,难于管理),而只需建立很少的一部分进程/线程,顾名思义,这些进程/线程将由所有会话共享。这样Oracle就能让更多的用户与数据库建立连接,否则很难连接更多用户。如果让我的机器管理10000个进程,这个负载肯定会把它压垮,但是管理100个或者1 000个进程还是可以的。采用共享服务器模式,共享进程通常与数据库一同启动,使用ps命令可以看到这个进程。

 

 

共享服务器连接和专用服务器连接之间有一个重大区别,与数据库连接的客户进程不会与共享服务器直接通信,但专用服务器则不然,客户进程会与专用服务器直接通信。之所以不能与共享服务器直接对话,原因就在于这个服务器进程是共享的。为了共享这些进程,还需要另外一种机制,通过这种机制才能与共享服务器进程“对话”。为此,Oracle使用了一个或一组称为调度器(dispatcher,也称分派器)的进程。客户进程通过网络与一个调度器进程通信。这个调度器进程将客户的请求放入SGAUGA中的请求队列(这也是SGA的用途之一)。第一个空闲的共享服务器会得到这个请求,并进行处理(例如,请求可能是UPDATE T SET X =X+5 WHERE Y = 2)。完成这个命令后,共享服务器会把响应放在原调度器(即接收请求的调度器)的响应队列中。调度器进程一直在监听这个队列,发现有结果后,就会把结果传给客户。

 

 

客户连接向调度器发送一个请求。调度器首先将这个请求放在SGA中的请求队列中①。第一个可用的共享服务器从请求队列中取出这个请求②并处理。共享服务器的处理结束后,再把响应(返回码、数据等)放到响应队列中③,接下来调度器拿到这个响应④,传回给客户。

 

 

. oracle客户端与服务端的连接

 

首先一个用户进程发出一个连接请求,如果使用的是主机命名或者是本地服务命中的主机名使用的是机器名(IP地址),那么这个请求都会通过DNS服务器或HOST文件的服务名解析然后传送到ORACLE监听进程,监听进程接收到用户请求后会采取两种方式来处理这个用户请求。

 

C:/Documents and Settings/Administrator>sqlplus sys/aibo@test as sysdba

 

SQL*Plus: Release 10.2.0.4.0 - Production on 星期一 8 16 10:51:15 2010

 

Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.

 

 

连接到:

Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options

 

SQL>

 

sys/aibo是用户名密码, testTNS服务名,TNS代表透明网络底层Transparent Network Substrate),这是Oracle客户端处理远程连接的“基础”软件,有了它才有可能建立对等通信。TNS连接串告诉Oracle软件如何与远程数据库连接。一般地,你的机器上运行的客户软件会读取一个tnsnames.ora文件。这是一个纯文本的配置文件,内容例如:

 

TEST =

  (DESCRIPTION =

    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.2.10)(PORT = 1521))

    (CONNECT_DATA =

      (SERVER = DEDICATED)

      (SERVICE_NAME = test)

    )

  )

 

 

Oracle客户端软件可以从tns连接串TEST得到有用的信息,也就是主机名,主机监听的端口号,主机所连接的数据库服务名,服务名表示具有公共属性、服务级阈值和优先级的应用组。提供服务的实例数量对应用是透明的,每个数据库实例可以向监听器注册,表示要提供多个服务。所以,服务就映射到物理的数据库实例,并允许DBA为之关联阈值和优先级。

 

现在oracle客户端通过tns连接串可以知道要连接到哪里,他会与主机(HOST = 192.168.2.10)在端口,打开一条tcp/ip socket连接;如果服务端恰好配置了oracle net,并且有一个监听进程在1521端口监听连接请求,就会受到这个连接请求。在网络环境中,我们会一个tns监听进程,就是这个监听进程可以让我们客户端与服务器物理连接。当他接受到这个请求后,会根据自己的配置文件处理这个请求连接,可能会拒绝请求(例如,因为没有这样的数据库,或者可能我们的IP地址受到限制,不允许连接这个主机),也可能会接受请求,并真正建立连接。

 

专用服务器模式下:监听进程接收到用户进程请求后,产生一个新的专用服务器进程,(UNIX上,这是通过fork()exec()系统调用做到的(UNIX中,要在初始化之后创建新进程,惟一的办法就是通过fork(); Windows上,监听器进程请求数据库进程为连接创建一个新线程。一旦创建了这个线程,客户就会“重定向”到该线程,相应地就能建立物理连接)并且将对用户进程的所有控制信息传给此服务器进程,也就是说新建的服务器进程继承了监听进程的信息,然后服务器进程给用户进程发一个RESEND包,通知用户进程可以开始给它发信息了,用户进程给这个新建的服务器进程发一个CONNECT包,服务器进程再以ACCEPT包回应用户进程,致此,用户进程正式与服务器进程确定连接, 我们把这种连接叫做HAND-OFF连接,也叫转换连接.

 

另一种方式是监听进程接收到用户进程的请求后产生一个新的专用服务器进程,这个服务器进程选用一个TCP/IP端口来控制与用户进程的交互,然后将此信息回传给监听进程,监听进程再将此信息传给用户进程,用户进程使用这个端口给服务器进程发送一个CONNECT包,服务器进程再给用户进程发送一个ACCEPT包,致此,用户进程可以正式向服务器进程发送信息了。这种方式我们叫做重定向连接。HAND-OFF连接需要系统平台具有进程继承的能力,为了使WINDOWS NT/2000支持HAND-OFF必须在    HKEY_LOCAL_MACHINE>SOFTWARE>ORACLE>HOMEX中设置 USE_SHARED_SOCKET

 

 

共享服务器模式下:只有重定向连接的方式,工作方式是监听进程接收到用户进程的请求后产生一个新的调度进程,这个调度进程选用一个TCP/IP端口来控制与用户进程的交互,然后将此信息回传给监听进程,监听进程再将此信息传给用户进程,用户进程使用这个端口给调度进程发送一个CONNECT包,调度进程再给用户进程发送一个ACCEPT包,致此,用户进程可以正式向调度进程发送信息了。

 

可以通过设置MAX_DISPIATCHERS这个参数来确定调度进程的最大数目,如果调度进程的个数已经达到了最大,或者已有的调度进程不是满负荷,监听进程将不再创建新的调度进程,而是让其中一个调度进程选用一个 TCP/IP端口来与此用户进程交互。调度进程每接收一个用户进程请求都会在监听进程处作一个登记,以便监听进程能够均衡每个调度进程的负荷,所有的用户进程请求将分别在有限的调度进程中排队,所有调度进程再顺序的把各自队列中的部分用户进程请求放入同一个请求队列,等候多个ORACLE的共享服务器进程进行处理(可以通过SHARED_SERVERS参数设置共享服务器进程的个数),也就是说所有的调度进程共享同一个请求队列,共享服务器模式下一个实例只有一个请求队列,共享服务器进程处理完用户进程的请求后将根据用户进程请求取自不同的调度进程将返回结果放入不同的响应队列,也就是说有多少调度进程就有多少响应队列,然后各个调度进程从各自的响应队列中将结果取出再返回给用户进程。

 

 

到目前为止,用户进程已经把需要执行的sql提交到oracle的服务进程,那oracle是如何处理这个进程的呢?

 

 

 

----续---

 

 

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

oracle客户端与服务端的连接 的相关文章

  • 创建每 5 分钟刷新一次的物化视图

    我创建了一个每 5 分钟刷新一次的物化视图 但是当我在物化视图上插入并执行选择时 我会得到相同的旧数据吗 需要手动刷新吗 CREATE MATERIALIZED VIEW MVW TEST REFRESH FORCE ON DEMAND S
  • 如何选择集合的第一个元素作为查询的列

    表 t 有两列 a 和 b a是整数 b是集合 我想为每一行选择 a 和集合 b 的第一个值 我试过了 但没用 WITH s a b AS SELECT 1 ff FROM DUAL UNION ALL SELECT 1 ee FROM D
  • 如何为 Weblogic 10.3.6 启用 Java 持久性 2.0

    我正在使用 eclipse 和 weblogic 服务器 为了将项目添加到 weblogic 服务器 它需要支持 Java Persistance 2 0 但是当尝试安装它时 我不断收到此消息 在 Weblogic Server 安装中启用
  • Oracle group by 中的字符串聚合

    我已经形成了一个大型查询 它使用以下数据条件获取大型数据集 Column1 Column2 M1 OTH M1 HHM M1 RES M2 HHM M2 RES M3 OTH M3 RES 我需要将其形成为 M1 OTH HHM RES M
  • 在 Oracle 临时表上放置索引安全吗?

    我读过 不应分析临时表 因为它会破坏其他表的统计信息 指数怎么样 如果我在程序运行期间在表上放置索引 使用该表的其他程序会受到该索引的影响吗 索引是否会影响我的进程以及使用该表的所有其他进程 或者它会单独影响我的过程吗 所有的回复都不是权威
  • oracle 数据透视表中的列

    示例选择 select from select 1 cnt 2 sm 55 name 12 month 2011 year 12 2011 mnth txt from dual union all select 1 cnt 2 sm 54
  • 如何对Oracle进行SQL注入

    我正在对一个系统进行审计 开发人员坚称该系统可以防止 SQL 注入 他们通过去掉登录表单中的单引号来实现这一点 但后面的代码没有参数化 它仍然使用字面 SQL 如下所示 username username Replace var sql s
  • 从 Oracle Varchar2 中查找并删除非 ASCII 字符

    我们目前正在将一个 Oracle 数据库迁移到 UTF8 并且发现一些记录接近 4000 字节 varchar 限制 当我们尝试迁移这些记录时 它们会失败 因为它们包含的字符变成了多字节 UF8 字符 我想要在 PL SQL 中做的是找到这
  • 如何在可能为空值的字段上创建唯一索引(Oracle 11g)?

    这是包含 3 列的示例表 ID UNIQUE VALUE UNIQUE GROUP ID 我希望可以允许以下记录 1 NULL NULL 2 NULL NULL or 3 NULL 7 4 123 7 or 注意 此条件不允许unique
  • 使用 SYS_CONNECT_BY_PATH 的 Oracle 累积计数

    当我尝试对实际数据执行以下查询时 它返回了更多记录数 请帮助解决这个问题 下面是表 DM TEMP SUMMING DVC BY FW 中的实际数据 device count dmc id firmware version cg id im
  • sqlldr.exe 不适用于 Windows 10

    我最近通过自定义安装安装了 Oracle 数据库客户端 12 1 0 2 0 winx64 并仅选择包括 SQL Loader 等在内的数据库实用程序 但是当我尝试执行 sqlldr exe 时 出现以下错误 在网上搜索后 我从所有站点 即
  • 在Oracle中查找不包含数字数据的行

    我试图在一个非常大的 Oracle 表中找到一些有问题的记录 即使该列是 varchar2 列 也应包含所有数值数据 我需要找到不包含数字数据的记录 当我尝试在此列上调用 to number col name 函数时 它会抛出错误 我想你可
  • 如何在 Oracle 上生成版本 4(随机)UUID?

    该博客解释说 输出sys guid 对于每个系统来说不是随机的 http feuerthoughts blogspot de 2006 02 watch out for sequential oracle guids html http f
  • 什么会导致 Oracle ROWID 更改?

    AFAIK Oracle 中的 ROWID 表示相应数据文件中记录的物理位置 在什么情况下记录的ROWID可能会改变 我所知道的一个是分区表上的更新 它将记录 移动 到另一个分区 还有其他情况吗 我们的大多数数据库都是 Oracle 10
  • Oracle Blob 在 PHP 页面中作为 img src

    我有一个网站当前使用文件服务器上的图像 这些图像显示在页面上 用户可以根据需要拖放每个图像 这是使用 jQuery 完成的 图像包含在列表中 每张图片都非常标准 img src network path image png height 8
  • Hibernate 本机查询 - char(3) 列

    我在 Oracle 中有一个表 其中列 SC CUR CODE 是 CHAR 3 当我做 Query q2 em createNativeQuery select sc cur code sc amount from sector cost
  • Oracle - 获取星期几

    今天是星期二 为什么当我运行这个 SQL 语句时 它说今天不是星期二 SELECT CASE WHEN TO CHAR sysdate Day Tuesday THEN Its Tuesday ELSE Its Not Tuesday EN
  • Oracle 删除约束级联等效于 Sql Server

    在Oracle中 删除约束PK SAI我使用语法 ALTER TABLE SAISIE DROP CONSTRAINT PK SAI CASCADE SQL Server 中与此等效的是什么 您正在考虑与实际 DELETE 语句相关的 FO
  • 如何计算选择查询的最佳获取大小

    在 JDBC 中 默认获取大小为 10 但我想当我有一百万行时 这不是最佳获取大小 据我所知 获取大小太低会降低性能 但如果获取大小太高也会降低性能 我怎样才能找到最佳尺寸 这对数据库端有影响吗 它会占用大量内存吗 如果您的行很大 请记住
  • 如何使用 Hibernate (EntityManager) 或 JPA 调用 Oracle 函数或过程

    我有一个返回 sys refcursor 的 Oracle 函数 当我使用 Hibernate 调用该函数时 出现以下异常 Hibernate call my function org hibernate exception Generic

随机推荐

  • Java 8Lambda表达式详解

    Lambda表达式是Java 8引入的一项重要特性 它提供了一种简洁而灵活的方式来定义匿名函数 Lambda表达式使得代码更具可读性和可维护性 并且在某些场景下能够提升代码的执行效率 本文将深入解析Lambda表达式的定义 语法 使用方法
  • Linux调试器gdb

    目录 一 关于Linux调试器gdb 二 gdb的操作 1 quit 2 l 3 r 4 b 行号 info b 5 d 断点编号 6 n 7 p 变量名 8 s 9 bt 10 finish 11 display 变量名 12 until
  • 喏,你们要的58条 Allegro 使用技巧汇总整理好了

    1 鼠标设定 在ALLEGRO视窗 LAYOUT时 每执行一个指令例 Add connect Show element等鼠标会跳到Option窗口 这样对layout造成不便 控制面版 滑鼠之移动选项中 指到预设按钮 或智慧型移动 取消 在
  • unity接入百度Unit理解与交互机器人和语音合成

    using Newtonsoft Json Linq using System using System Collections using System Collections Generic using System Diagnosti
  • C++ 封装文件操作类

    暂时封装一个文件输出类 平时要用的时候方便一些 include
  • leetcode随机刷933最近的请求次数

    933 最近的请求次数 先上题目 一段C 代码 class RecentCounter public queue
  • mmseg分词算法思路分析(中文新闻分词实测结论总结)

    首先先介绍一下mmseg分词算法 再详细分析新闻分词所用分词方式及其逻辑 一 mmseg分词算法 mmseg是一个非常好用的分词器 开箱即用 那么为什么还要了解其算法呢 1 没有任何一样技术可以直接适用于任何场景 了解其算法才能知道什么场景
  • Horizon8基础环境准备08——CA证书

    前言 在我们配置好connection服务器后 基本都会遇到CA证书的问题 这章原本打算和AD一起写的 但考虑到前期环境没有搭建完成 所以放到connection服务配置后再写 只有我们在遇到问题后 想办法解决了 才会印象深刻 正文 1 登
  • 小程序 web-view分享页面检测页面路径跳转

    需求 分享H5页面 打开小程序首页 进入指定的分享H5页面 1 分享函数 onShareAppMessage function Object object 监测分享页面 console log Object object 商城分享页面 re
  • 行为型模式 - 命令模式Command

    模式的定义与特点 命令模式 Command Pattern 是将一个请求封装成一个对象 从而使您可以用不同的请求对客户进行参数化 命令模式是把发出命令的责任和执行命令的责任分割开 委派给不同的对象 命令模式允许请求的一方和发送的一方独立开来
  • 微服务设计和高并发实践

    文章目录 1 微服务的设计原则 1 1 服务拆分方法 1 2 微服务的设计原则 1 3 微服务架构 2 高并发系统的一些优化经验 2 1 提高性能 2 1 1 数据库优化 2 1 2 使用缓存 2 1 3 服务调用优化 2 1 4 动静分离
  • Kotlin数据类型(三:基础数据类型转换)

    一 不可隐式转换 在Java中从小到大 可以隐式转换 数据类型将自动提升 下面以int为例 这么写是ok的 int a 2312 long b a 那么在Kotlin中 隐式转换 编译器会报错 val anInt Int 5 val ccL
  • Leetcode刷题309. 最佳买卖股票时机含冷冻期

    给定一个整数数组 其中第 i 个元素代表了第 i 天的股票价格 设计一个算法计算出最大利润 在满足以下约束条件下 你可以尽可能地完成更多的交易 多次买卖一支股票 你不能同时参与多笔交易 你必须在再次购买前出售掉之前的股票 卖出股票后 你无法
  • 网络安全/黑客技术(就业前景与经验分享)

    网络安全与我们每一个人都息息相关 无论是企业还是个人 现在都非常重视网络安全 而且网络安全是一个新兴的行业 人才需求量远远大于供给 所以在薪资福利上具有很大的优势 并且对于初学者而言 很多人依旧担心前景问题 从市场的情况来看 网络安全的就业
  • 删除对象中的指定元素怎么操作?

    小程序开发中 要实现的功能是 长按某个元素 将其移动到另一个对象中 例如 长按array1的苹果 苹果插入到array2中 菠萝 的前面 而array1中的苹果 删除 var array1 d 1 name 苹果 d 2 name 橘子 d
  • 两条语句告诉你 Python3 当中 [[]] * 10 和 [[] for i in range(10)] 的区别

    gt gt gt aa 10 gt gt gt bb for i in range 10 gt gt gt aa bb True gt gt gt aa 0 is aa 1 True gt gt gt bb 0 is bb 1 False
  • 面试官:说说对React中类组件和函数组件的理解?有什么区别?

    一 类组件 类组件 顾名思义 也就是通过使用ES6类的编写形式去编写组件 该类必须继承React Component 如果想要访问父组件传递过来的参数 可通过this props的方式去访问 在组件中必须实现render方法 在return
  • 华为OD机试 - 拔河比赛(Java)

    题目描述 公司最近准备进行拔河比赛 需要在全部员工中进行挑选 选拔的规则如下 按照身高优先 体重次优先的方式准备比赛阵容 规定参赛的队伍派出10名选手 请实现一个选拔队员的小程序 输入为一个数组 记录了部门人员的身高 体重信息 如 身高 体
  • linux gz文件合并,快速合并多个fastq.gz文件

    案例描述 需要将Sample test1 R1 fastq gz和Sample test2 R2 fastq gz合并为test fastq gz 操作方法1 先zcat再gzip zcat Sample test 1 R1 fastq g
  • oracle客户端与服务端的连接

    author skate time 2010 08 16 oracle客户端与服务端的连接 参考如下 http blog csdn net wyzxg archive 2010 08 16 5815335 aspx oracle服务进程如何