第2章 体系结构概述 - 2.3 连接Oracle

2.3.1 专用服务器(dedicated server)

如果现在在使用一个专用服务器登陆数据库,则会创建一个新的进程,提供专门的服务:

C:>PSList Oracle

pslist v1.28 - Sysinternals PsList
Copyright ? 2000-2004 Mark Russinovich
Sysinternals

Process information for BIGSUN:

Name                Pid Pri Thd  Hnd   Priv        CPU Time    Elapsed Time
oracle             3768   8  13  260 169768     0:00:01.822     0:21:40.259

C:>SQLPLUS Muziyu/me

SQL*Plus: Release 9.2.0.1.0 - Production on 星期六 10月 6 14:57:46 2007

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.


连接到:
Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production

MUZIYU@MYDB> HOST PSList Oracle

pslist v1.28 - Sysinternals PsList
Copyright ? 2000-2004 Mark Russinovich
Sysinternals

Process information for BIGSUN:

Name                Pid Pri Thd  Hnd   Priv        CPU Time    Elapsed Time
oracle             3768   8  14  268 170416     0:00:01.832     0:22:12.776

MUZIYU@MYDB> QUIT
从Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production中断开

C:>PSList Oracle

pslist v1.28 - Sysinternals PsList
Copyright ? 2000-2004 Mark Russinovich
Sysinternals

Process information for BIGSUN:

Name                Pid Pri Thd  Hnd   Priv        CPU Time    Elapsed Time
oracle             3768   8  13  260 169768     0:00:01.842     0:22:28.619

可以看到,服务器刚启动的时候Oracle有13个线程(可能你的数据库启动时的线程数和我的不同,不过不用奇怪,这与你的数据库启动服务多少有一定的关系)。当我们用专用服务器连接Oracle时,Oracle线程由13个增加到14个。注销时,这个额外的线程也没有了。在UNIX上,可以看到正在运行的Oracle进程列表上会加一个进程,这就是我们的专用服务器。

现在如果按最常用的配置连接Oracle,如图2-2所示:

Figure 2-2. Typical dedicated server configuration

图2-2 典型的专用服务器配置

在我登陆时,Oracle总会为我创建一个新的进程。这通常称为专用服务器配置,因为这个服务器进程会在我的会话生存期中专门为我服务。对于每个会话,都会出现一个新的专用服务器,会话与专用服务器之间存在一对一的映射。按照定义,这个专用服务器不是实例的一部分。我的客户进程(也就是想要连接数据库的程序)会通过某种网络通道(如TCP/IP Socket)与这个专用服务器直接通信,并由这个服务器进程接收和执行我的SQL。这个服务器进程的主要目标就是对我提交的SQL调用做出响应。

2.3.2 共享服务器(shared server)

共享服务器,正式的说法是多线程服务器(Multi-Threaded Server,MTS)。如果采用这种方式,就不会对每条用户连接创建另外的线程或者新的UNIX进程。在共享服务器中,Oracle使用一个“共享进程”池为大量用户提供服务。共享服务器实际上就是一种连接池机制。这样我们可以为更多的用户提供数据库连接。

共享服务器连接和专用服务器连接之间有一个重大区别,与数据库连接的客户进程不会与共享服务器直接通信,但专用服务器则不然,客户进程会与专用服务器直接通信。之所以不能与共享服务器直接对话,原因就在于这个服务器进程是共享的。为了共享这些进程,还需要另外一种机制,通过这种机制才能与数据库进程共享“对话”。为此,Oracle使用了一个或一组称为调度器(dispatcher,也称分配器)的进程。客户进程通过网络与一个调度器进程通信。这个调度器进程将客户的请求放入SGA中的请求队列(这也是SGA的用途之一)。共享服务器请求的流程如图2-3所示:

Figure 2-3. Steps in a shared server request

图2-3 共享服务器请求的流程步骤

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

2.3.3 TCP/IP连接的基本原理

这里将分析网络上最常见的一种情形:在TCP/IP连接上建立一个基于网络的连接请求。例如,客户可以发起以下命令:

C:>SQLPLUS NQ/nqdev@NQ

SQL*Plus: Release 9.2.0.1.0 - Production on 星期日 10月 7 14:36:50 2007 

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved. 

连接到:
Oracle9i Enterprise Edition Release 9.2.0.1.0 - 64bit Production 
With the Partitioning, OLAP and Oracle Data Mining options 
JServer Release 9.2.0.1.0 - Production 

NQ@NQ>

这里,客户是程序SQL*Plus,NQ/nqdev为用户名/密码,NQ是一个TNS服务名。

TNS代表透明网络底层(Transparent Network Substrate),这是Oracle客户中处理远程连接的“基础”软件。一般地,你的机器上运行的客户软件会读取一个tnsnames.ora文件,这是一个纯文本的配置文件,通常放在[ORACLE_HOME]/Network/Admin目录下。例如,在我的机器上,tnsnames.ora存放在C:/Oracle/Ora92/Network/Admin目录下:

NQ =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 200.200.200.240)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = NQ)
    )
  )

根据这个配置信息,Oracle客户软件可以把我们使用的TNS连接串NQ映射到某些有用的信息,也就是主机名、该主机上“监听器”进程接受(监听)连接的端口、盖主机上所连接数据库的服务名,等等。服务名表示具有公共属性、服务级阈值和优先级的应用组。连接串(NQ)还可以使用Oracle Internet目录(Oracle Internet Directory,OID)来解析,这是一个分部式轻量级目录访问协议(Lightweight Directory Access Protocol,LDAP)服务器,其作用就相当于解析主机名的DNS。

注意:tnsnames.ora通常只适用于大多数小到中型安装,在这些情况下,这些配置文件的副本不算太多,尚可管理。

既然客户软件知道连接到哪里,它会于主机名为NQ的服务器在端口1521上打开一条TCP/IP Socket连接。如果服务器DBA安装并配置了Oracle Net,并且有一个监听器在端口1521上监听连接请求,就会受到这个连接。在网络环境中,我们会在服务器上运行一个称为TNS监听器的进程。就是这个监听进程能让我们与数据物理连接。当它接受请求时,它会使用自己的配置文件检查这个请求,可能会拒绝请求,也可能拒绝请求,并真正建立连接。

如果建立一条专用服务器连接,监听器进程就会为我们创建一个专用服务器。在UNIX上,这是通过fork()和exec()系统调用做到的。这个新的专用服务器进程继承了监听器建立的连接,现在就与数据库物理地连接上了。在Windows上,监听器进程请求数据库进程为连接创建一个新的线程。一旦创建了这个线程,客户就会“重定向”到该线程,相应地就能建立物理连接。图2-4显示了UNIX上的监听器进程和专用服务器连接:

Figure 2-4. The listener process and dedicated server connections

图2-4 监听器进程和专用服务器连接

另一方面,如果我们发起共享服务器连接请求,接收到连接请求后,监听器会从可用的调度器池里选择一个调度器进程,监听器会向客户返回连接信息,其中说明了客户如何与调度器进程连接;如果可能的话,还可以把连接“转发”给调度器进程。监听器发回连接信息后,它的工作就结束了,因为监听器一直在特定主机的特定端口上运行,而调度器会在服务器上随意指派的端口上接收连接。监听器要知道调度器指定的这些随机端口号,并为我们选择一个服务器。客户再与监听器断开连接,并与调度器直接连接。现在就与数据库有了一个物理连接。如图2-5所示:

Figure 2-5. The listener process and shared server connections

图2-5 监听器进程和共享服务器连接

软件环境:Windows XP SP3+Oracle 9i R2,[ORACLE_HOME]=C:/Oracle/Ora92

PSList v1.28:http://www.microsoft.com/china/technet/sysinternals/utilities/PsList.mspx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值