在Oracle的网络体系结构中,有3种类型的网络结构:单层网络结构、两层网络结构(C/S结构)、多层网络结构(B/S结构)。
(1)单层网络结构
单层网络结构示意图如图4-1所示。单层网络结构由客户端和数据库服务器组成,客户端直接连接到主机,客户端和服务器之间的连接没有通过任何网络。而数据库服务器一般都由大型机充当。单层网络结构是最简单的一种网络结构。因为客户端直接连接到数据库服务器上,所以,这种结构管理起来比较容易。单层网络结构的所有应用都集中在服务器上,所以,如果服务器性能差,则服务器将会成为整套应用的瓶颈。由于这种结构的特殊性,其可扩展性和灵活性将大打折扣。
图4-1 单层网络结构
目前,这种结构的应用不是特别广泛。
(2)两层网络结构(C/S结构)
两层网络结构示意图如图4-2所示。
图4-2 两层网络结构
两层网络结构是前几年最流行的网络结构,当时,许多应用都基于此结构,这种结构的盛行,造就了Sybase公司的PownerBuild和Borland公司Delphi的神话。同时,中国许多优秀的开发人员在那时脱颖而出。
两层网络结构由客户端和数据库服务器组成。客户端和服务器之间通过网络进行连接。要实现这种应用,客户端和服务器之间必须要有相同的通信协议,而最流行的协议是TCP/IP。
在C/S结构中,有一部分应用会被放到客户端执行,这就减小了服务器的负载。C/S结构比单层网络结构更加易于扩展,更加灵活!
C/S结构有诸多优点,但是,CS结构也有诸多缺点。首先,在客户端必须安装应用的客户端软件,这就增加了客户端维护的成本;其次,由于客户端分担了一部分服务器的负载,如果客户端机器的配置差,将会影响到整个应用的性能。和B/S结构相比,C/S结构的可扩展性和可维护性略逊一筹。
(3)多层网络结构(B/S结构)
经过多年的发展,多层网络结构已经取代两层结构,主导整个软件开发的市场。
如图4-3所示,多层结构一般由客户端、应用服务器、Web服务器、数据库服务器等组成。客户端一般不需要安装任何软件,只需安装浏览器。应用服务器负责商业逻辑的计算;数据库服务器负责数据的管理。
图4-3 多层网络结构
多层网络结构有下面的优点。
■ 客户端无须安装额外的软件(只需安装浏览器),这就大大减少了客户端维护的成本,甚至可以说,客户端只需零维护。
■ 应用服务器部分分担了数据库服务器的负载,大大提高了整套应用的性能。
■ 由于客户端不再直接访问数据库,对数据库的访问由中间件服务器(应用服务器或者Web服务器)完成,这就加强了数据库的安全,减少了数据库服务器被互联网上黑客攻击的危险。
■ 多层网络结构更易于扩展。
■ 多层网络结构更易于管理。
Oracle Net是Oracle的网络组件,它能够建立客户端或者中间件服务器到数据库服务器的连接,并负责客户端到服务器端连接的维护。一旦建立好网络连接,Oracle Net就可以在客户端和服务器之间传送数据,如图4-4所示。
图4-4 Oracle网络服务
在客户端,Oracle Net是一个后台组件。SQL*Plus、Oracle Forms等将会用到Oracle Net,但是,我们却看不到Oracle Net的存在。
在服务器端,Oracle Net包括一个活动的进程叫监听器(listener),监听器负责同步外部程序和数据库服务器之间的连接。如果没有监听器,则客户端将无法连接数据库。
通过Oracle Net,Oracle可以调用外部代码库和过程(EXTPROC)。通过Oracle Net,Oracle可以连接到第三方的数据库,如:Sybase、DB2、SQL Server等。
开放式系统互联模型(Open System Interconnection,OSI)是得到业界认可的一个模型。OSI定义了如何在网络之间传送数据。OSI模型分成7层,每层负责不同的工作。每一层的工作都依赖其他层。上面几层负责与应用程序交互,并负责数据的表示;下面几层负责网络上数据的传输。上面几层把数据的目的地和如何处理这些数据的信息传递给下面几层,下面几层则把通信的状态信息返回给上面几层。
OSI的7层结构如图4-5所示。
图4-5 OSI的7层结构
■ 第1层——应用层,负责与应用程序进行交互,接收命令,并返回数据。
■ 第2层——表示层,负责解决客户与服务器之间的差别,也负责数据的格式化。
■ 第3层——会话层,负责管理网络流,决定是发送数据还是接收数据。
■ 第4层——传输层,负责源端和目的端网络进程之间的交互,检测错误并进行纠正。
■ 第5层——网络层,负责在两个节点之间分发数据。
■ 第6层——数据链路层,维持连接的可靠性。
■ 第7层——物理层,通过网络传输电信号。
OSI是Oracle通信栈的基础,Oracle通信栈中每一层的特点和功能都能够从OSI模型中找到依据。Oracle网络在OSI的最高层与基础网络进行交互。实际上,Oracle网络是建立在基本网络之上的。
Oracle Net是一套Oracle的网络通信软件,它不仅用于客户端和数据库服务器之间创建网络会话,还负责维护会话连接和传送数据。Oracle Net必须同时位于服务器端和客户端。
如图4-6所示,Oracle通信栈分为以下几层。
■ 应用层(The Application Layer)。
■ Oracle调用接口OCI层(The Oracle Call Interface Layer,OCI)。
■ Two-Task Common层(TTC)。
■ Oracle网络基础层(Oracle Net Foundation Layer),以前叫TNS层。
■ Oracle协议适配层(The Oracle Protocol Adapters Layer,OPA)或叫协议支持层。
■ 协议层(Protocol Layer)。
■ Oracle应用程序接口层(The Oracle Program Interface Layer,OPI),只存在于服务器端。
图4-6 Oracle Net堆栈结构
(1)应用层(存在于客户端)
Oracle通信栈中,应用层的功能和OSI模型中应用层的功能相同。该层负责与用户的交互。这一层提供接口组件、屏幕、数据控制元素。表格、菜单等就是这一层实际的例子。这一层与OCI层进行通信。
(2)Oracle调用接口OCI层(存在于客户端)
OCI层负责客户端和服务器之间所有SQL语句的处理。在服务器端有与之对应的接口层OPI。OCI层负责打开/关闭游标(cursor)、绑定变量、读取数据。OCI层是开发的接口层,第三方可以开发调用OCI层的应用。OCI层直接把信息传到TTC层。
(3)Two-Task Common层(TTC)
TTC层负责客户端和服务器之间数据类型(datatype)和字符集(Character Set)的转换。TTC其实就是一个翻译者,它把值(value)从一种字符集转换成另外一种字符集。TTC层把信息传到网络基础层(Oracle Net Foundation Layer)。
(4)Oracle网络基础层(Oracle Net Foundation Layer)
网络基础层以前叫TNS层或网络透明底层。这一层的功能和OSI模型中的会话层相对应。该层是基于透明网络底层(Transparent Network Substrate,TNS),这一层使得Oracle网络变成一个开放的体系结构,Oracle可以兼容大量的网络协议。这一层屏蔽了网络的复杂性,负责建立和维护客户端与服务器之间的连接,还负责客户端和服务器的信息交换。
在客户端,网络基础层接受客户端应用程序的请求,然后解析与连接相关的信息,这些信息包括:
■ 数据库服务器的位置。
■ 连接时涉及哪些协议。
■ 如何处理客户端和服务器端之间的中断(interrupt)。
在服务器端,网络基础层除了完成和上面类似的功能外,还和服务器端的监听器协同工作,接收客户端的连接请求。
(5)协议适配层(The Oracle Protocol Adapters Layer,OPA)
协议适配层(The Oracle Protocol Adapters layer,OPA)也叫Oracle协议支持层(Oracle Protocol Support Layer)。Oracle协议支持层与协议层进行通信。该层将Oracle Net的基础层与下面相应功能的工业标准协议匹配起来。这一层支持的协议有:TCP/IP、TCP/IP with SSL、Named Pipes、SDP。
(6)协议层(Protocol Layer)
这些协议就是工业标准协议,这些协议不是由Oracle公司开发的,是独立于Oracle的。这些协议有:TCP/IP、TCP/IP with SSL、Named Pipes、SDP。
在配置Oracle网络之前,我们必须在客户端和服务器端安装和配置好这些协议。这些工作都是在操作系统(OS)级别完成的。
(7)Oracle应用程序接口层(The Oracle Program Interface layer,OPI)
这一层仅存在于服务器端。OPI层负责对客户端的每个请求做出适当的反应。如:当客户端发出请求数据的SQL语句以后,服务器端的OPI接口就处理此请求。
在Oracle数据库服务器中,是通过一个叫“监听器”的组件接收来自客户端的连接请求。它是客户端和服务器端的中间组件。监听器是位于服务器端的一个后台进程,它负责对客户端传入的连接请求进行监听,并且对服务器端的连接负荷进行调整。当客户端试图建立一个到服务器端的连接时,监听器接收到客户端的请求,然后再将它交给服务器进行处理,一旦客户端和服务器建立连接,客户端和服务器以后就直接进行通信,而不再需要监听器的参与。监听器的工作原理如图4-7所示。
客户端向服务器端发出连接请求,监听器监听到客户端的连接请求。
监听器监听到客户端的连接请求后,把客户端的连接请求交给数据库服务器处理。
图4-7 监听器的工作原理
客户端和服务器端建立连接,连接建立以后,服务器端和客户端直接进行通信,而不再需要监听器的参与。也就是说,监听器的功能只是负责建立客户端和服务器端的连接,它并不负责客户端和服务器端的通信。
我们在客户端使用SQL*Plus登录数据库服务器以后,我们发出一条命令,这条命令被直接发送给数据库服务器(不通过监听器),数据库服务器处理完这条命令以后,直接把命令的执行结果返回给客户端(不通过监听器)。
监听器启动的时候,会读取一个叫listener.ora的文件,这个文件叫“监听器配置文件”,这个文件指定监听器所在的主机、监听器监听的实例名、监听的端口号、监听的协议等信息。这个文件的内容类似于:
■ LISTENER是监听器的名字,我们也可以使用别的名字。
■ ORACLE_HOME是Oracle的主目录。
■ SID_NAME是监听器监听的数据库的实例名。本例中的实例是nbo。
■ PROTOCOL是监听器监听的协议。本例中使用的是TCP/IP。
■ HOST指定数据库服务器的主机名或者IP地址。本例中数据库服务器的IP地址是192.168.123.6。
■ PORT指定监听器使用的端口号,默认的端口号是1521。
客户端要连接数据库服务器,需要指定数据库服务器的IP地址、数据库的实例名、使用的端口号等信息。在Oracle Net中,要连接的数据库服务器的相关信息是通过“连接描述符”来识别的。当执行查询时,连接描述符指定通信协议、服务器名和实例名等。连接描述符也包含硬件连通性信息。连接描述符的格式如下:
■ PROTOCOL用于指定使用的协议。本例中使用的是TCP/IP。
■ HOST指定数据库服务器的主机名或者IP地址。本例中数据库服务器的IP地址是192.168.123.6。
■ PORT指定监听器使用的端口号,默认的端口号是1521。
■ SID指定请求的数据库的实例名。本例中请求的实例是st。
■ SERVER指定连接请求的服务类型是专有服务器连接(SERVER=DEDICATED)还是共享服务器连接(SERVER=SHARED)。
当我们访问远程数据的时候,都需要输入类似于下面的连接描述符,这些信息描述了我们要连接的数据库。
这些信息都非常冗长,如果用户每次访问远程数据库时都输入那么冗长的信息,就会浪费大量的时间,降低用户的工作效率。为此,DBA可以给这些冗长的字符串(连接描述符)起一个“别名”。在Oracle中,我们把这样的别名叫“网络服务名(Net Service Name)”。如果配置好了网络服务名,则当我们每次连接远程数据库的时候,无须输入那么冗长的信息,只需输入网络服务名,便可轻轻松松登录远程的数据库服务器。
网络服务名存储在称为tnsnames.ora的文件中,该文件被复制到数据库网络中的所有服务器上。每个客户机和应用程序服务器也应该有该文件。
在服务器上,tnsna mes.ora文件的位置由环境变量TNS_ADMIN指定。tnsna me.ora通常被存放在$ORACLE_HOME/network/admin( UNIX 平台)或者ORACLE_HOME\network\admin( Windows平台 )下。
其中,ORACLE_HOME表示Oracle的主目录(Oracle Home)。
下面我们将举例说明使用网络服务名登录数据库给我们带来的好处。
在本例中,将要连接的目标数据库的主机名是xxxx,端口号是1521,实例名是nbo。
示例一:使用“连接字符串”登录远程数据库。
从上面信息可以看出,每次登录远程数据库服务器时,我们都需要输入远程数据库服务器的主机名、端口号和实例名等信息。这项工作比较烦琐,如果在实际应用中,数据库服务器的数量很多,对于普通用户来说,记住每台数据库服务器的主机名(IP)、端口号等信息也很不容易,这就凸显出使用连接字符串登录数据库的弊端。
示例二:使用“网络服务名”登录远程数据库。
客户端网络配置文件tnsnames.ora的内容如下,这个文件定义了网络服务名TONBO。
■ PROTOCOL用于指定使用的协议。本例中使用的是TCP/IP。
■ HOST指定数据库服务器的主机名或者IP地址。本例中的数据库服务器的IP地址是192.168.123.6。
■ PORT指定监听器使用的端口号,默认的端口号是1521。
■ SERVICE_NAME指定请求数据库的实例名。本例中请求的实例是nbo。
使用网络服务名tonbo登录远程数据库。
从上面的过程可以看出,使用“网络服务名”登录数据库的时候,我们无须知道远程数据库服务器的主机名(IP地址)、端口号、实例名等信息,我们只需输入服务名tonbo便能轻轻松松登录数据库。
对比上面两个例子,可以看出,使用连接字符串登录数据库比较麻烦,且需要记忆的东西比较多,特别是对不熟悉Oracle的用户;使用网络服务名登录数据库比较方便,只需输入网络服务名,一切搞定!在Oracle实际应用中,基本上都是使用网络服务名来连接数据库。
当我们通过网络服务名(有的地方叫服务名)登录数据库的时候,Oracle首先把服务名解析成一个“地址”,这种机制叫“服务名解析”,这个“地址”包括要连接的服务器的主机名(IP地址)、实例名、端口号等信息。Oracle提供下面几种服务名解析的方法。
■ 本地命名方式(Local Naming )。本地命名方式将网络服务名及它们所对应的连接描述符都存储在本地的叫tnsnames.ora的配置文件中。通过这个文件,就能够在本地完成网络服务名的解析。
■ 目录命名方式(Directory Naming )。目录命名方式将网络服务名全部存储在一个叫LDAP兼容的目录服务器中。客户端必须先访问目录服务器以完成网络服务名的解析,然后才能访问数据库服务器。
■ 外部命名方式(External Naming )。外部命名方式利用支持命名的非Oracle服务器来存储和Oracle网络服务名相关的信息。这些服务器包括NIS外部名称服务器、分布式计算环境(DcE)等。
为了更好地配置Oracle网络,Oracle公司提供了下面的工具,用于配置和诊断Oracle网络。
■ Oracle Net Configuration Assistant是一个图形化的网络管理工具,利用它可以完成Oracle网络的配置,包括监听器的配置、命名方法的配置、网络服务名等的配置。
■ Oracle Net Manage也是一个图形化的网络管理工具,用于配置Oracle的网络。
■ Listener Control Utility是一个命令行工具,用来管理监听器,包括监听器的启动、关闭,以及查看监听器的状态等。
■ Oracle Connection Manager Control Utility用来管理连接管理器。