首页 > 数据库 > Oracle > 正文
oracle客户端与服务端的连接
2012-02-18       个评论      
收藏    我要投稿
author:skate
oracle服务进程如何处理用户进程的请求,参考如下:/database/201202/120122.html
 

要想登录数据库并在数据库中真正做事情,一定要先连接数据库,根据连接的原理不同,分为专用服务器连接(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,也称分派器)的进程。客户进程通过网络与一个调度器进程通信。这个调度器进程将客户的请求放入SGA中UGA中的请求队列(这也是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是用户名密码, test是TNS服务名,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是如何处理这个进程的呢?
 
 
 
----续---
 
点击复制链接 与好友分享!回本站首页
相关TAG标签 客户端 端的
上一篇:oracle一个事务的完整流程分析
下一篇:oracle的resetlogs机制浅析
相关文章
图文推荐
文章
推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训
版权所有: 红黑联盟--致力于做实用的IT技术学习网站