首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

这一节将介绍Oracle服务器处理请求的两种最常见的方式,并分析它们的基本原理,这两种方式分别是专用服务器dedicated server)连接和共享服务器shared server)连接。要想登录数据库并在数据库中真正做事情,必须先连接,我们会说明建立连接时客户端和服务器端会发生什么。最后会简要地介绍如何建立TCP/IP连接(TCP/IP是网络上连接Oracle所用的主要网络协议),并说明对于专用服务器连接和共享服务器连接,服务器上的监听器listener)进程会以不同的方式工作,这些监听器进程负责建立与服务器的物理连接。

2.3.1  专用服务器

从图2-1pslist输出可以看出启动Oracle之后是什么样子。如果现在使用一个专用服务器登录数据库,则会创建一个新的进程,提供专门的服务:

现在可以看到,线程有20个而不是19个,多加的这个线程就是我们的专用服务器进程(稍后会介绍专用服务器进程的更多内容)。注销时,这个额外的线程也没有了。在UNIX上,可以看到正在运行的Oracle进程列表上会多加一个进程,这就是我们的专用服务器。

再回过来看前面的那个图。现在如果按最常用的配置连接Oracle,则如图2-2所示。


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

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

2.3.2  共享服务器

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

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


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

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

在开发人员看来,共享服务器连接和专用服务器连接之间并没有什么区别。

既然已经了解了专用服务器连接和共享服务器连接是什么,你可能会有一些疑问:

q  首先怎么才能连接呢?

q  谁来启动这个专用服务器?

q  怎么与调度器联系?

这些问题的答案取决于你的特定平台,不过下一节会概括介绍一般的过程。

2.3.3  TCP/IP连接的基本原理

这里将分析网络上最常见的一种情形:在TCP/IP连接上建立一个基于网络的连接请求。在这种情况下,客户在一台机器上,而服务器驻留在另一台机器上,这两台机器通过一个TCP/IP网络连接。客户率先行动,使用Oracle客户软件(Oracle提供的一组应用程序接口,或API)建立一个请求,力图连接数据库。例如,客户可以发出以下命令:

这里,客户是程序SQL*Plusscott/tiger为用户名/密码,ora10g.localdomain是一个TNS服务名。TNS代表透明网络底层Transparent Network Substrate),这是Oracle客户中处理远程连接的“基础”软件,有了它才有可能建立对等通信。TNS连接串告诉Oracle软件如何与远程数据库连接。一般地,你的机器上运行的客户软件会读取一个tnsnames.ora文件。这是一个纯文本的配置文件,通常放在 [ORACLE_HOME]\network\admin 目录下([ORACLE_HOME] 表示Oracle安装目录的完整路径)。如果有以下配置:

根据这个配置信息,Oracle客户软件可以把我们使用的TNS连接串ora10g.localdomain映射到某些有用的信息,也就是主机名、该主机上“监听器”进程接受(监听)连接的端口、该主机上所连接数据库的服务名,等等。服务名表示具有公共属性、服务级阈值和优先级的应用组。提供服务的实例数量对应用是透明的,每个数据库实例可以向监听器注册,表示要提供多个服务。所以,服务就映射到物理的数据库实例,并允许DBA为之关联阈值和优先级。

这个串(ora10g.localdomain)还可以用其他方式来解析。例如,可以使用Oracle Internet目录(Oracle Internet DirectoryOID),这是一个分布式轻量级目录访问协议(Lightweight Directory Access ProtocolLDAP)服务器,其作用就相当于解析主机名的DNS。不过,tnsnames.ora文件通常只适用于大多数小到中型安装,在这些情况下,这个配置文件的副本不算太多,尚可管理。

既然客户软件知道要连接到哪里,它会与主机名为localhost.localdomain的服务器在端口1521上打开一条TCP/IP socket连接。如果服务器DBA安装并配置了Oracle Net,并且有一个监听器在端口1521上监听连接请求,就会收到这个连接。在网络环境中,我们会在服务器上运行一个称为TNS监听器的进程。就是这个监听器进程能让我们与数据库物理连接。当它收到入站连接请求时,它会使用自己的配置文件检查这个请求,可能会拒绝请求(例如,因为没有这样的数据库,或者可能我们的IP地址受到限制,不允许连接这个主机),也可能会接受请求,并真正建立连接。

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

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

另一方面,如果我们发出共享服务器连接请求,监听器的表现则会有所不同。监听器进程知道实例中运行了哪些调度器。接收到连接请求后,监听器会从可用的调度器池中选择一个调度器进程。监听器会向客户返回连接信息,其中说明了客户如何与调度器进程连接;如果可能的话,还可以把连接“转发”给调度器进程(这依赖于不同的操作系统和数据库版本,不过实际效果是一样的)。监听器发回连接信息后,它的工作就结束了,因为监听器一直在特定主机的特定端口上运行(主机名和端口号大家都知道),而调度器会在服务器上随意指派的端口上接受连接。监听器要知道调度器指定的这些随机端口号,并为我们选择一个调度器。客户再与监听器断开连接,并与调度器直接连接。现在就与数据库有了一个物理连接。这个过程如图2-5所示。


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

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论