异构的数据源同Oracle Database做交互原理。

图1

上图是一张Oracle 异构连接处理的架构图,其中我们可以看到主要的非数据源模块包括有HS(Heterogeneous Service), Agent. 还有一个远程数据库,我们假设它是异构的数据源。

可以看到,Oracle是不能直接同这些异构数据源作交互,Oracle是需要通过Heterogeneous Services协同Agent才能和异构数据源作数据交互

Heterogeneous Services Component

HS是Oracle Database的一个组件,它用于同Non-Oracle System作数据交互。

HS的作用:它告诉Agent它要同异构数据源作交互,并且让他知道,它要什么数据,什么样的数据,如何处理数据(如类型,方法等)。

HS主要包含两个模块:

A. 事务服务(Transaction Service)

Transaction Service使异构数据源尽可能的集成进Oracle数据库服务器里的 事务和会话中。 所以当你访问一个异构数据源的时候,你使用Oracle 用户当前的会话来通过数据库连接(Database Link)在异构数据源建立相应的认证会话(访问异构数据源的认证信息由用户提供或者Database Link已经指定)。同样,当用户关闭了当前Oracle的Session(会话),那么异构数据源上的相应会话也随之关闭。 Oracle 另外支持Oracle分布式的访问异构数据源的事务。

B. 结构化查询语言服务服务(SQL Service)

SQL Service用于处理所有的SQL相关的操作,包括有:

a) 使Oracle内部SQL相关的调用 映射成 HS 驱动的API. 这些会一次被驱动映射到异构数据源的客户端API.

b) 翻译SQL语句。把Oracle的SQL语句翻译成相关的异构数据源的SQL语句。

c) 翻译通过引用Oracle data dictionary的相关表的查询语句,使之变成可以从异构数据源的data dictionary里获取所需信息的查询语句

d) 转换异构数据源和Oracle数据库之间的数据类型

e) 弥补在异构数据源中不存在的函数方法等,使之变成多条产需语句来获取相应的结果。

HS的组件里有很多常见的编码,并且它被配置用于同很多不同的异构数据源一起协同工作。每个gateway都有这些配置信息,并且存在在相应的驱动模块中(Driver module). 这些信息会在HS和Gateway/Agent的连接建立后马上被上传到Oracle服务器。这些配置信息包括有:

a) Data Dictionary Translation Views

数据字典转换视图是以视图的方式存在于异构数据源的数据字典表里。它帮助HS像引用Oracle的Data dictionary表一样来饮用异构数据源的数据字典。

b) Heterogeneous Services Initialization Parameters

HS初始化参数主要提供两个方面的功能:

1) 提供一个良好的调节gateway的手段,使gateway和HS组件的性能和内存的使用得到优化。

2) 配置异构数据源的信息. 例如配置了多少个异构数据源,它们都运行了什么语言,都有哪些属性。

相关当前会话的这些参数的设置信息,我们可以通过查询表V$HS_PARAMETER来得到。可以在gateway的初始化文件里进行设置更改。

c) Capabilities

功能性就是告诉HS异构数据源中有哪些类型的SQL语句不支持,如何转换映射这些SQL表达式到异构数据源里。

HS Data Dictionary

上面我们提到,配置信息。配置信息会在HS和Agent建立连接后,马上被Agent上传到HS 组件。那么上传后,它们都被存储与HS Data Dictionary表中。并且直到Agent的变化,这些信息才会被相应的覆盖,修改。

下面我们讲解下这些Data Dictionary的相关信息:

使用HS,可以从同一个Oracle数据库访问多个异构数据源,如下图所示:

图2

两个Agent都会把配置信息上传上去,各自存在到HS Data Dictionary table中.

那么这些信息是怎么归纳起来的?HS把这些信息按两个层次来分:

a) Class

Class 是按照相关类型的产品来分。例如Sybase database systems, SQL Server databases system各分到一类里面。

b) Instance

实例是基于class来定义的。例如SQL Server数据库这个class里面有多个实例。

所以一个class被多个特定的instance所共享。所以假设oracle数据库要访问5个SQL Server的实例和2个MySQL的实例,那么Oracle数据库就需要两个class定义来访问他们。一个用于定义SQL Server,一个用于定义MySQL.同样,在这两个class中分别定义了5个和2个instance的定义。 同时这里需要注意,instance 层的容量和数据字典的信息都是会话信息,所以它们不能存在在oracle数据库中的HS数据字典中。但是,instance的初始化参数可以存在在数据库中。在HS的数据字典视图(Data Dictionary views)中都包含了一下信息:

n 被上传到Oracle data dictionary的instances和classes的名称

n 功能性,包括为每个class和instance定义的SQL 事务

n 为每个class和instance定义的数据字典转化关系

n 为每个class和instance定义的初始化参数

这些视图又主要被分成三大类:

n 常规视图

n Transaction Service 视图

n SQL Service 视图

Agent Component

Agent Component包括:

A. Agent Generic Code

Agent Generic Code用于在异构数据源上执行数据操作或者检索.它负责接收命令,执行命令,获取执行结果。

B. Driver

Driver是Agent Generic Code和命令执行地交互的桥梁。没有它,Agent Generic Code就不能和异构数据源交互。

Agent Generic Code好比一个要到河对岸办事的人,Driver就好比到对岸的交通工具,例如 桥。

从图1中,我们可能会想到Agent是否可以单独放在某个环境中?当然是可以的,

a) 它可以和异构数据源安装在同一台计算机上

b) 它可以同Oracle安装在同一台计算机上

c) 它可以同Oracle和异构数据源都分离开而安装在单独的一台计算机上

Oracle 为Agent提供了很多类型,因为不同的数据库厂商所使用的标准不一样,这些Agent通过Oracle产品主要封装在以下两种产品中:

A. Oracle Database

在Oracle Database中,默认安装的是ODBC Agent.用于同当前系统的ODBC来做交互。从而由系统来负责Driver. 相应的Agent Generic Code是dg4odbc.exe ,这个程序可以在ORACLE_HOME/bin目录下找到.

B. Oracle Database Gateways

由Oracle Database Gateways产品来选择性的安装针对于不同数据库产品的Agent(Agent Generic Code, Driver).所以Driver也和Oracle Database Gateways安装的时候一起安装。例如,你安装了Gateway for MS SQL Server的组件,那么你可以在ORACLE_HOME/bin文件下找到Agent Generic Code : dg4msql.exe, 在ORACLE_HOME/dg4msql文件夹里找到相关的Agent的Driver,在该文件下同样存放在一些配置相关的dg4msql的配置文件。

我们来整体看一下HS和Gateway是如何系统工作的:

图3

(1) 客户端从Oracle Database请求数据。用户发送的是Oracle标准的SQL语句,在Oracle数据库上创建了一个Session。

(2) HS和Gateway协同工作,HS把Oracle的SQL语句转换成non-Oracle数据库可以正确运行的语句。

a) HS和Gateway建立连接

b) HS获取相关的non-Oracle System的配置信息,如它是什么类型的数据库产品(SQL Server或者MySql , Sybase)等等属性

c) HS通过Data Dictionary View来识别该non-Oracle system的功能特征等各项属性,相应的转化Oracle标准的SQL语句成non-Oracle system兼容的语句

(3) Oracle数据库把转换后的SQL语句通过Oracle Net发送到Gateway。

(4) Gateway使用相关的用户名密码登陆到non-Oracle system,建立连接,执行SQL语句。

a) HS通过Gateway与Non-Oracle System建立连接,创建临时的Database Link.

b) Gateway使用Database Link指定的用户名及其密码登陆non-Oracle system

c) Gateway登陆成功则创建Gateway与non-Oracle System之间的会话,并且Database Link Open

d) Gateway把SQL语句通过建立的会话发送给non-oracle system执行

(5) Non-Oracle System返回运行SQL语句后的结果给Gateway。

(6) Gateway翻译/格式化返回的结果使其能被Oracle数据库的所兼容。

(7) 把Gateway执行后的结果通过Oracle Net Service返回给Oracle数据库。

(8) Oracle数据库服务器通过Oracle Net把结果返回给客户端。并且数据库的database link一直打开这,直到gateway的会话结束或者database link显式的关闭它。

在上述步骤中,第(2)步,Gateway通过本地的配置来调用相关的HS服务程序和驱动与异构数据源作交互。例如:

a) 在配置initXXX.ora的时候,里面填写的主要是异构数据源的Address信息,如 主机名称/地址,端口,实例名称,数据库等等信息。

b) 在配置listener.ora的时候,里面就记录了需要使用什么Agent Generic Code程序,需要通过什么使用到驱动。比如访问MS SQL Server,需要用到的Agent Generic Code程序是dg4msql, 驱动在Oracle_Gateway_Home\dg4msql\driver\lib文件夹下。(如果Gateway安装在Windows下,默认不需要指定Driver的路径)

Oracle HS (Heterogeneous Services)深入解析 及协同Gateway工作流程(转)的更多相关文章

  1. Oracle AWR报告指标全解析-11011552

    1-5 Top 5 Timed EventsWaits : 该等待事件发生的次数, 对于DB CPU此项不可用Times : 该等待事件消耗的总计时间,单位为秒, 对于DB CPU 而言是前台进程所消 ...

  2. Oracle中Clob类型处理解析:ORA-01461:仅可以插入LONG列的LONG值赋值

    感谢原作者:破剑冰-Oracle中Clob类型处理解析 上一篇分析:ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值 最近为Clob字段在插入数据时发现当字符的字节数(一个半角字符一 ...

  3. Oracle使用Sql把XML解析成表(Table)的方法

    SELECT * FROM XMLTABLE('$B/DEAL_BASIC/USER_DEAL_INFO' PASSING XMLTYPE('<?xml version="1.0&qu ...

  4. oracle dblink 查询 tns:无法解析指定的连接标识符

    问题情景是这样的:我在数据库服务器(windows server 2008r2 ,64bit)oracle(11gr2,64bit)中通过dblink连接到另外一台服务器(hp-ux)的oracle( ...

  5. 【Oracle学习笔记-3】关于Oracle 10g中各种服务解析

    [原创]关于oracle 10g中各种服务解析 (2014/10/16 8:39:40) 时间:2014-10-16 8-58-30     作者:ssslinppp 1. 当首次安装oracle 1 ...

  6. Fixflow引擎解析(一)(介绍) - Fixflow开源流程引擎介绍

    Fixflow引擎解析(四)(模型) - 通过EMF扩展BPMN2.0元素 Fixflow引擎解析(三)(模型) - 创建EMF模型来读写XML文件 Fixflow引擎解析(二)(模型) - BPMN ...

  7. [推荐]ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句(不给规则,不成方圆)

    原文:[推荐]ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句(不给规则,不成方圆) [推荐]ORACLE PL/SQL编程详解之三: PL/SQL流程控制语句(不给规则,不成方圆) ...

  8. 服务容错保护断路器Hystrix之二:Hystrix工作流程解析

    一.总运行流程 当你发出请求后,hystrix是这么运行的 红圈 :Hystrix 命令执行失败,执行回退逻辑.也就是大家经常在文章中看到的“服务降级”. 绿圈 :四种情况会触发失败回退逻辑( fal ...

  9. rest_framework解析器组件源码流程

    rest_framework解析器组件源码流程 解析器顾名思义就是对请求体进行解析.为什么要有解析器?原因很简单,当后台和前端进行交互的时候数据类型不一定都是表单数据或者json,当然也有其他类型的数 ...

随机推荐

  1. django中时区设置

    通过django中的models更新数据库的DateTimeField字段,发现有错误,于是更改了: TIME_ZONE = 'Asia/Shanghai' 结果,还是不正确,于是把: USE_TZ ...

  2. No deleted LINE chat messages recovered on iOS 9.1 after UFED extraction

    The evidence is iPhone 5s with iOS 9.1 and not jail breaked. I use UFED to do advanced logical extra ...

  3. javaSE第二十四天

    第二十四天    363 1:多线程(理解)    363 (1)JDK5以后的Lock锁    363 A:定义    363 B:方法:    364 C:具体应用(以售票程序为例)    364 ...

  4. MVC开发Markdown编辑器(2)

    MVC开发Markdown编辑器(2) MVC Markdown 实时预览 我希望实现一个在线实时预览的Markdown编辑器,左边是编辑处,右边是实时预览界面. 准备工作 引入相关js和css 这里 ...

  5. swift皮筋弹动发射飞机

    今天在那个ios教程网上看到了一个不错的ios游戏源码,这是一个款采用swift实现的皮筋弹动发射飞机游戏源码,游戏源码比较详细,大家可以研究学习一下吧. <ignore_js_op> & ...

  6. Linux rabbitmq的安装和安装amqp的php插件

    RabbitMQ是一个消息代理.它的核心原理非常简单:接收和发送消息.你可以把它想像成一个邮局:你把信件放入邮箱,邮递员就会把信件投递到你的收件人处.在这个比喻中,RabbitMQ是一个邮箱.邮局.邮 ...

  7. linux下关于mysqldump备份的.sql导入数据库表数据丢失优化

    直切正题 前2个随笔做了linux下自动备份,但是备份的.sql文件发现表数据丢失,原因是数据库太大我的数据库文件是804M,在用ftp拉去也会丢失数据 所以对db.sh备份数据库加一个压缩gizp ...

  8. 多层级Spinner列表选项实时更新树形层级(选择城市)

    package com.example.spinnerdemo; import android.os.Bundle; import android.app.Activity; import andro ...

  9. Windows7不能打开telnet功能

    在dos窗口中输入telnet命令提示如下: 解决方法是打开控制面板中的程序和功能,选择打开或关闭Window是功能,如下: 勾选上面的Telnet客户端,然后确定,出现下图.稍等片刻重新打开命令行, ...

  10. 【easyui】--普通js中获取easyui中分页信息(page,pageSize等)

    对于datagrid,获取其分页信息: 方法: var pageopt = $('#list_data').datagrid('getPager').data("pagination&quo ...