精华内容
下载资源
问答
  • Dubbo 同步、异步调用的几种方式

    千次阅读 2019-03-15 00:04:20
    基于这种机制,Dubbo 实现了以下几种调用方式同步调用 异步调用 参数回调 事件通知 同步调用 同步调用是一种阻塞式的调用方式,即 Consumer 端代码一直阻塞等待,直到 Provider 端返回为止; ...

    https://yq.aliyun.com/articles/608811

    我们知道,Dubbo 缺省协议采用单一长连接,底层实现是 Netty 的 NIO 异步通讯机制;基于这种机制,Dubbo 实现了以下几种调用方式:

    • 同步调用
    • 异步调用
    • 参数回调
    • 事件通知

    同步调用

    同步调用是一种阻塞式的调用方式,即 Consumer 端代码一直阻塞等待,直到 Provider 端返回为止;

    通常,一个典型的同步调用过程如下:

    1. Consumer 业务线程调用远程接口,向 Provider 发送请求,同时当前线程处于阻塞状态;
    2. Provider 接到 Consumer 的请求后,开始处理请求,将结果返回给 Consumer;
    3. Consumer 收到结果后,当前线程继续往后执行。

    这里有 2 个问题:

    1. Consumer 业务线程是怎么进入阻塞状态的?
    2. Consumer 收到结果后,如果唤醒业务线程往后执行的?

    其实,Dubbo 的底层 IO 操作都是异步的。Consumer 端发起调用后,得到一个 Future 对象。对于同步调用,业务线程通过Future#get(timeout),阻塞等待 Provider 端将结果返回;timeout则是 Consumer 端定义的超时时间。当结果返回后ÿ

    展开全文
  • 数据库连接几种方式

    千次阅读 2016-10-19 15:18:05
    ADO涉及的数据存储DSN(数据源名称)、ODBC(开放式数据连接)以及OLE DB三种方式。后面的例程将详细讲解这三种方式的具体访问实现。---可以说是对odbc,oledb这些系统级的编程接口的汇接,并对DAO,RDO这些应用级的...

    ODBC(Open Database Connectivity,开放数据库互连)是微软公司开放服务结构(WOSA,Windows Open Services Architecture)中有关数据库的一个组成部分,它建立了一组规范,并提供了一组对数据库访问的标准API(应用程序编程接口)。这些API利用SQL来完成其大部分任务。ODBC本身也提供了对SQL语言的支持,用户可以直接将SQL语句送给ODBC。---出现的最早,但不总是万能。是Microsoft引进的一种早期数据库接口技术。它实际上是ADO的前身。

    DAO(Data Access Objects):数据访问对象是用来显露了Microsoft Jet数据库引擎(最早是给Microsoft Access 所使用,现在已经支持其它数据库),并允许开发者通过ODBC直接连接到其他数据库一样,直接连接到 Access 表。DAO 最适用于单系统应用程序或在小范围本地分布使用。其内部已经对Jet数据库的访问进行了加速优化,而且其使用起来也是很方便的。所以如果数据库是Access数据库且是本地使用的话,建议使用这种访问方式---应用的专一性

    RDO(Remote Data Objects)远程数据对象是一个到ODBC的、面向对象的数据访问接口,它同易于使用的DAO style组合在一起,提供了一个接口,形式上展示出所有ODBC的底层功能和灵活性。尽管RDO在很好地访问Jet或ISAM数据库方面受到限制,而且它只能通过现存的ODBC驱动程序来访问关系数据库。但是,RDO已被证明是许多SQL Server、Oracle 以及其他大型关系数据库开发者经常选用的最佳接口。RDO提供了用来访问存储过程和复杂结果集的更多和更复杂的对象、属性,以及方法。---无疑是在odbc基础上的

    OLE DB 是 Microsoft 的一个战略性系统级编程接口,用于管理整个组织内的数据。OLE DB 是建立在 ODBC 功能之上的一个开放规范。ODBC 是为访问关系型数据库而专门开发的,OLE DB 则用于访问关系型和非关系型信息源,例如主机 ISAM/VSAM 和层次数据库,电子邮件和文件系统存储,文本、图形和地理数据以及自定义业务对象。  
    OLE DB 定义了一组 COM 接口,对各种数据库管理系统服务进行封装,并允许创建软件组件,实现这些服务。OLE DB 组件包括数据提供程序(包含和表现数据)、数据使用者(使用数据)和服务组件(处理和传送数据,例如,查询处理器和游标引擎)。  
    OLE DB 接口有助于平滑地集成组件,这样,OLE DB 组件厂商就可以快速地向市场提供高质量 OLE DB 组件。此外,OLE DB 包含了一个连接 ODBC 的“桥梁”,对现用的各种 ODBC 关系型数据库驱动程序提供一贯的支持。---号称取代odbc,但也兼容odbc

    ADO(ActiveX Data Object)是DAO/RDO的后继产物。ADO 2.0在功能上与RDO更相似,而且一般来说,在这两种模型之间有一种相似的映射关系。ADO"扩展"了DAO和 RDO 所使用的对象模型,这意味着它包含较少的对象、更多的属性、方法(和参数),以及事件。 作为最新的数据库访问模式,ADO的使用也是简单易用,所以微软已经明确表示今后把重点放在ADO上,对DAO/RDO不再作升级,所以ADO已经成为了当前数据库开发的主流。 ADO涉及的数据存储有DSN(数据源名称)、ODBC(开放式数据连接)以及OLE DB三种方式。后面的例程将详细讲解这三种方式的具体访问实现。---可以说是对odbc,oledb这些系统级的编程接口的汇接,并对DAO,RDO这些应用级的编程接口的升级吧。

    ----------------------------------------------------------------------------------
    OLEDB的性能比较  

    有许多种办法可以连上一个数据库. 你可以用System DSN, DSN-less连接或是本地的OLEDB provider. OLEDB? 这是什么什么玩艺儿? 也许你们中的许多人以前没有听说过. 要回答这个问题,我们先得回顾一下数据库连接的历史.  

    早期的数据库连接是非常困难的. 每个数据库的格式都不一样,开发者得对他们所开发的每种数据库的底层API有深刻的了解. 因此,能处理各种各样数据库的通用的API就应运而生了. 也就是现在的ODBC(Open Database Connectivity), ODBC是人们在创建通用API的早期产物. 有许多种数据库遵从了这种标准,被称为ODBC兼容的数据库.  
    ODBC兼容的数据库包括Access, MS-SQL Server, Oracle, Informix等.  

    但ODBC并不是完美无缺的,它仍然含有大量的低级的调用,开发ODBC应用程序仍较困难. 开发者不得不将大量的精力花在底层的数据库通信中,而不能专注于他们所要处理的数据. 后来微软提出了一个解决方案: DAO(Data Access Objects). DAO的代码看起来象这样:  

    objItem.AddNew  
    objItem.Name = "Chair"  
    objItem.Price = 10  
    objItem.Update  

    你也许看过DAO的代码. 后来DAO演变为RDO(Remote Data Objects, 为分布式数据库体系设计), 再后来是ADO. 尽管它们都有各自的不足之处. 根据微软的说法,"ODBC提供了本地SQL数据的存取,DAO提供了高级的数据对象". DAO和RDO都需要数据以SQL(Structured Query Language)的格式存储. 针对这些缺陷,微软提出了OLEDB,一个基于COM的数据存储对象,能提供对所有类型的数据的操作,甚至能在离线的情况下存取数据(比方说,你使用的是你的便携机,你可以毫不费力地看到最后一次数据同步时的数据映像).  

    OLEDB位于ODBC层与应用程序之间. 在你的ASP页面里,ADO是位于OLEDB之上的"应用程序". 你的ADO调用先被送到OLEDB,然后再交由ODBC处理. 你可以直接连接到OLEDB层,如果你这么做了,你将看到服务器端游标(recordset的缺省的游标,也是最常用的游标)性能的提升. 那我们该如何直接连接到OLEDB呢?  

    要想直接连到OLEDB层,你必须改变你的connection对象连接字符串. 先用老办法创建一个connectiong对象:  

    Dim objConn  
    Set objConn = Server.CreateObject("ADODB.Connection")  

    接下去,我们不用常规的类似DSN=pubs or DRIVER={MS SQL-  
    Server};UID=sa;PWD=;DATABASE=pubs;SERVER=myMachine的连接字符串,而采用下面的连接字符串:  

    objConn.ConnectionString = "Provider=ProviderName; Data  
    Source=DatabaseSource; Initial Catalog=DatabaseName; User ID=UserID;  
    Password=Password"  

    对于SQL:  
    ProviderName = SQLOLEDB  
    Data Source = Server Name  
    Initial Catalog = Database Name  

    对于Access:  
    ProviderName = Microsoft.Jet.OLEDB.3.51  
    Data Source = Full path to .MDB file  

    下面让我们来看两个例子,一个是针对Access的,还有一个是针对SQL的. 如果你的连接SQL的DSN-less连接串是这样的:  

    DRIVER={MS SQL-Server};UID=sa;PWD=;DATABASE=pubs;SERVER=myMachine  

    那么直接连接到OLEDB的连接字符串应该是这样的:  

    Provider=SQLOLEDB; Data Source=myMachine; Initial Catalog=pubs; User  
    ID=sa; Password=  

    让我们来看看Access,如果你的Access的连接字符串是:  

    DRIVER={Microsoft Access Driver (*.mdb)};  
    DBQ=c:\inetpub\wwwroot\users.mdb  

    那么直接连接到OLEDB的连接字符串应该是这样的:  

    Provider=Microsoft.Jet.OLEDB.3.51; Data  
    Source=c:\inetpub\wwwroot\users.mdb  

    就是这么简单,挺棒的吧?  

    这很重要吗?  
    现在你也许对为什么要学习这种新的数据库连接方法感到有些儿迷惑,为什么不走标准的DSN-less/System DSN路子呢? 让我来告诉你为什么. 据Wrox出的ADO 2.0  
    Programmer's Reference一书中的测试,用OLEDB连接而不是DSN或DSN-less的连接会得到的性能提升如下:  

    性能比较  
    SQL Access  
     OLEDB DSN OLEDB DSN  
    Connection Times: 18 82 Connection Times: 62 99  
    Iterating through 1,000 Records Times: 2900 5400 Iterating through  
    1,000 Records Times: 100 950

    展开全文
  • 应用系统之间数据传输的几种方式

    千次阅读 2018-03-27 14:34:54
    随着近年来SOA(面向服务技术架构)的兴起,越来越多的应用系统开始进行分布式的设计和部署。...应用系统之间数据传输三个要素:传输方式,传输协议,数据格式数据传输方式一般无非是以下几种:1 soc...
    

    随着近年来SOA(面向服务技术架构)的兴起,越来越多的应用系统开始进行分布式的设计和部署。系统由原来单一的技术架构变成面向服务的多系统架构。原来在一个系统之间可以完成的业务流程,通过多系统的之间多次交互来实现。这里不打算介绍如何进行SOA架构的设计,而是介绍一下应用系统之间如何进行数据的传输。

    应用系统之间数据传输有三个要素:传输方式,传输协议,数据格式

    数据传输方式一般无非是以下几种:

    1 socket方式

     Socket方式是最简单的交互方式。是典型才c/s 交互模式。一台客户机,一台服务器。服务器提供服务,通过ip地址和端口进行服务访问。而客户机通过连接服务器指定的端口进行消息交互。其中传输协议可以是tcp/UDP 协议。而服务器和约定了请求报文格式和响应报文格式。如图一所示:

     

    目前我们常用的http调用,java远程调用,webserivces 都是采用的这种方式,只不过不同的就是传输协议以及报文格式。

    这种方式的优点是:

    1 易于编程,目前java提供了多种框架,屏蔽了底层通信细节以及数据传输转换细节。

    2 容易控制权限。通过传输层协议https,加密传输的数据,使得安全性提高

    3 通用性比较强,无论客户端是.net架构,java,python 都是可以的。尤其是webservice规范,使得服务变得通用

    而这种方式的缺点是:

    1 服务器和客户端必须同时工作,当服务器端不可用的时候,整个数据交互是不可进行。

    2 当传输数据量比较大的时候,严重占用网络带宽,可能导致连接超时。使得在数据量交互的时候,服务变的很不可靠。

     

    2 ftp/文件共享服务器方式

     

    对于大数据量的交互,采用这种文件的交互方式最适合不过了。系统A和系统B约定文件服务器地址,文件命名规则,文件内容格式等内容,通过上传文件到文件服务器进行数据交互。

    最典型的应用场景是批量处理数据:例如系统A把今天12点之前把要处理的数据生成到一个文件,系统B第二天凌晨1点进行处理,处理完成之后,把处理结果生成到一个文件,系统A 12点在进行结果处理。这种状况经常发生在A是事物处理型系统,对响应要求比较高,不适合做数据分析型的工作,而系统B是后台系统,对处理能力要求比较高,适合做批量任务系统。

     

    以上只是说明通过文件方式的数据交互,实际情况B完成任务之后,可能通过socket的方式通知A,不一定是通过文件方式。

     

     

    这种方式的优点:

    1 在数据量大的情况下,可以通过文件传输,不会超时,不占用网络带宽。

    2 方案简单,避免了网络传输,网络协议相关的概念。

    这种方式的缺点:

    1 不太适合做实时类的业务

    2 必须有共同的文件服务器,文件服务器这里面存在风险。因为文件可能被篡改,删除,或者存在泄密等。

    3 必须约定文件数据的格式,当改变文件格式的时候,需要各个系统都同步做修改。

     

    3 数据库共享数据方式

    系统A和系统B通过连接同一个数据库服务器的同一张表进行数据交换。当系统A请求系统B处理数据的时候,系统A Insert一条数据,系统B select 系统A插入的数据进行处理。

    这种方式的优点是

    1 相比文件方式传输来说,因为使用的同一个数据库,交互更加简单。

    2 由于数据库提供相当做的操作,比如更新,回滚等。交互方式比较灵活,而且通过数据库的事务机制,可以做成可靠性的数据交换。

    这种方式的缺点:

    1 当连接B的系统越来越多的时候,由于数据库的连接池是有限的,导致每个系统分配到的连接不会很多,当系统越来越多的时候,可能导致无可用的数据库连接

    2 一般情况,来自两个不同公司的系统,不太会开放自己的数据库给对方连接,因为这样会有安全性影响

     

    4 message方式

    Java消息服务(Java Message Service)是message数据传输的典型的实现方式。系统A和系统B通过一个消息服务器进行数据交换。系统A发送消息到消息服务器,如果系统B订阅系统A发送过来的消息,消息服务器会消息推送给B。双方约定消息格式即可。目前市场上有很多开源的jms消息中间件,比如  ActiveMQ, OpenJMS 。

    这种方式的优点

    1 由于jms定义了规范,有很多的开源的消息中间件可以选择,而且比较通用。接入起来相对也比较简单

    2 通过消息方式比较灵活,可以采取同步,异步,可靠性的消息处理,消息中间件也可以独立出来部署。

    这种方式的缺点

    1 学习jms相关的基础知识,消息中间件的具体配置,以及实现的细节对于开发人员来说还是有一点学习成本的

    2 在大数据量的情况下,消息可能会产生积压,导致消息延迟,消息丢失,甚至消息中间件崩溃。

     

    下面具体来分析一个场景,来看看系统之间数据传输的应用

    场景 目前业务人员需要导入一个大文件到系统A,系统A保存文件信息,而文件里面的明细信息需要导入到系统B进行分析,当系统B分析完成之后,需要把分析结果通知系统A。

     

    A 系统A先保存文件到文件服务器。

    B 系统A 通过webservice 调用系统B提供的服务器,把需要处理的文件名发送到系统B。由于文件很大,需要处理很长时间,所以B不及时处理文件,而是保存需要处理的文件名到数据库,通过后台定时调度机制去处理。所以B接收请求成功,立刻返回系统A成功。

    C 系统B定时查询数据库记录,通过记录查找文件路径,找到文件进行处理。这个过程很长。

    D 系统B处理完成之后发送消息给系统A,告知系统A文件处理完成。

    E 系统A 接收到系统B请求来的消息,进行展示任务结果

    展开全文
  • 关于数据同步几种实现

    千次阅读 2018-08-08 09:11:08
    关于数据同步几种实现 转载:https://blog.csdn.net/xuemoyao/article/details/14002209 概述 关于数据同步主要两个层面的同步,一是通过后台程序编码实现数据同步,二是直接作用于数据库,在数据库层面实现...

    关于数据同步的几种实现

    转载:https://blog.csdn.net/xuemoyao/article/details/14002209
    概述

    关于数据同步主要有两个层面的同步,一是通过后台程序编码实现数据同步,二是直接作用于数据库,在数据库层面实现数据的同步。通过程序编码实现数据同步,其主要的实现思路很容易理解,即有就更新,无则新增,其他情况日志记录,就不做过多的介绍,这里主要讲述的是第二个层面的数据同步,即在数据库层面实现数据同步。

    数据库层面的数据库同步主要有三种方式:通过发布/订阅的方式实现同步,通过SQL JOB方式实现数据同步,通过Service Broker 消息队列的方式实现数据同步。

    下面分别就这三种数据同步方式,一一详解。

    1. 通过发布/订阅的方式实现同步

    发布/订阅是Sql Server自带的一种数据库备份的机制,通过该机制可以快速的实现数据的备份同步,不用编写任何的代码。

    此种数据同步的方式存在的以下的一些问题:

    表结构不能更改,同步双方的表结构必须一致,一旦表结构发生更改需要重新生成数据库快照。
    对于大数据量的同步没有可靠的保证。
    网络不稳定的情况下同步也不能保证。
    总的来说,这种数据备份同步的方式,在表结构一致、数据量不是特别大的情况下还是非常高效的一种同步方式。

    网上有很多的关于如何使用发布/订阅的方式实现数据同步的操作示例,这里就不再重复的演示了,有兴趣想要了解的朋友可以参考下面这篇文章:

    http://kb.cnblogs.com/page/103975/

    1. 通过SQL JOB方式实现数据同步

    通过Sql Job定时作业的方式实现同步其基本原理就是通过目标服务器和源服务器的连接,然后通过编写Sql语句,从源服务器中读取数据,再更新到目标服务器。

    这种数据同步的方式比较灵活。创建过sql定时作业之后,主要需要执行以下关键的两步。

    2.1 创建数据库连接(一般作为定时作业执行的第一步)

    不同数据库之间的连接可以通过系统的存储过程实现。下面就直接用一个示例来讲一下如何创建数据库连接。

    –添加一个连接

    –系统存储过程sp_addlinkedserver 参数:

    ———————-1:目标服务器的IP或别名,本例中为:’WIN-S1PO3UA6J7I’;———————-2:” (srvproduct,默认);

    ———————-3:’SQLOLEDB’(provider,默认值);

    ———————-4:目标服务器的IP或别名(datasrc),本例中为:’WIN-S1PO3UA6J7I’

    exec sp_addlinkedserver ‘WIN-S1PO3UA6J7I’,”,’SQLOLEDB’,’WIN-S1PO3UA6J7I’

    –添加登录用户连接

    –系统存储过程sp_addlinkedsrvlogin 参数:

    ———————-1:目标服务器的IP或别名,本例中为:’WIN-S1PO3UA6J7I’;

    ———————-2:’false’,默认值;

    ———————-3:null,默认值;

    ———————-4:’sa’,登录用户名;

    ———————-5:’pass@word1’,登录密码;

    exec sp_addlinkedsrvlogin ‘WIN-S1PO3UA6J7I’,’false’,null,’sa’,’pass@word1’

    创建数据库连接主要用到了以上的两个存储过程,但是在实际操作的过程中可能会遇到“仍有对服务器XXX的远程登录或连接登录问题”这样的问题,如果遇到此类问题,在执行上边的添加连接和登录用户连接之前还需要先删除某个已存在的链接,具体如下:

    –系统存储过程sp_droplinkedsrvlogin 参数:

    ———————-1:目标服务器的IP或别名,本例中为:’WIN-S1PO3UA6J7I’;———————-2:null

    exec sp_droplinkedsrvlogin ‘WIN-S1PO3UA6J7I’,null

    –系统存储过程sp_dropserver 参数:

    ———————-1:目标服务器的IP或别名,本例中为:’WIN-S1PO3UA6J7I’

    exec sp_dropserver ‘WIN-S1PO3UA6J7I’

    2.2 使用SQL 语句 实现数据同步

    主要的同步思路:

    1:在目标数据库中先清空要同步的表的数据

    2:使用insert into Table (Cloumn….) select Column….. from 服务器别名或IP.目标数据库名.dbo.TableName 的语法将数据从源数据库读取并插入到目标数据库

    Truncate table Org_DepartmentsExt –删除现有系统中已存在的部门表

    insert into Org_DepartmentsExt –从名为WIN-S1PO3UA6J7I的服务器上的DBFrom数据库上获取源数据,并同步到目标数据库中

     (
    
      [DeptID]
    
      ,[DeptStatus]
    
      ,[DeptTel]
    
      ,[DeptBrief]
    
      ,[DeptFunctions] 
    
     )
    

    SELECT [DeptID]

      ,[DeptStatus]
    
      ,[DeptTel]
    
      ,[DeptBrief]
    
      ,[DeptFunctions]
    

    FROM [WIN-S1PO3UA6J7I].[DBFrom].[dbo].[Org_DepartmentsExt]

    以上这两步便是通过SQL Job实现数据同步的关键步骤,在完成以上两步之后,如果没有其他的表要进行同步,则可创建同步计划以完善定时作业。带作业创建完后,便可以执行。

    这里主要只是演示了通过Sql Job方式实现数据同步的关键步骤。网上有很多具体的实例演示。有兴趣的朋友可以参考以下文章进行练习检验:

    http://www.cnblogs.com/tyb1222/archive/2011/05/27/2060075.html

    1. 通过SQL Server Service Broker 消息队列的方式实现数据同步

    3.1 SQL Server Service Broker概述

    SQL Server Service Broker 是数据库引擎的组成部分,为 SQL Server 提供队列和可靠的消息传递。既可用于使用单个 SQL Server 实例的应用程序,也可用于在多个实例间分发工作的应用程序。

    在单个 SQL Server 实例内,Service Broker 提供了一个功能强大的异步编程模型。数据库应用程序通常使用异步编程来缩短交互式响应时间,并增加应用程序总吞吐量。

    在多个SQL Server实例之间Service Broker 还可以提供可靠的消息传递服务。Service Broker 可帮助开发人员通过称为服务的独立、自包含的组件来编写应用程序。需要使用这些服务中所包含功能的应用程序可以使用消息来与这些服务进行交互。Service Broker 使用 TCP/IP 在实例间交换消息。Service Broker 中所包含的功能有助于防止未经授权的网络访问,并可以对通过网络发送的消息进行加密。

    3.2 具体的实现演示

    在这一小节里,主要是通过一个完整的数据同步的流程向大家演示,如何实现同一个数据库实例不同数据库的数据同步。关于不同的数据库实例间的数据库的数据同步整体上跟同一个实例的数据库同步是一样的,只不过在不同的数据库实例间同步时还需启用传输安全、对话安全,创建路由、远程服务绑定等额外的操作。

    这里边用到了大量的SQL Server XML的东西,如果有不理解的地方可以参考以下链接:http://www.cnblogs.com/Olive116/p/3355840.html

    这是我在做技术准备时,自己的一点学习记录。

    下面就是具体的实现步骤:

    3.2.1为数据库启动Service Broker活动

    这一步主要是用来对要进行数据同步的数据启用Service Broker 活动,并且授信。
    

    USE master
    GO
    –如果数据库DBFrom、DBTo不存在,则创建相应的数据库
    IF NOT EXISTS (SELECT name FROM sys.databases WHERE name =’DBFrom’)
    CREATE DATABASE DBFrom
    GO
    IF NOT EXISTS (SELECT name FROM sys.databases WHERE name =’DBTo’)
    CREATE DATABASE DBTo
    GO
    –分别为该数据库启用Service Broker活动并且授权信任
    ALTER DATABASE DBFrom SET ENABLE_BROKER
    GO
    ALTER DATABASE DBFrom SET TRUSTWORTHY ON
    GO
    ALTER AUTHORIZATION ON DATABASE::DBFrom To sa
    GO
    ALTER DATABASE DBTo SET ENABLE_BROKER
    GO
    ALTER DATABASE DBTo SET TRUSTWORTHY ON
    GO
    ALTER AUTHORIZATION ON DATABASE::DBTo TO sa
    GO

    3.2.2 创建数据库主密匙

    这一步主要用来创建数据库主密匙,上边有提到Service Broker可以对要发送的消息进行加密。

    Use DBFrom
    go
    create master key
    encryption by password=’pass@word1’
    go

    Use DBTo
    go
    create master key
    encryption by password=’pass@word1’
    go

    3.2.3 创建消息类型、协定

    这里主要用来创建消息类型和消息协定,源数据库和目标数据库的消息类型和协定都要一致。

    Use DBFrom
    go
    –数据同步—消息类型
    create message type [http://oa.founder.com/Data/Sync]
    validation=well_formed_xml
    go
    –数据同步–错误反馈消息类型
    create message type [http://oa.founder.com/Data/Sync/Error]
    validation=well_formed_xml
    go
    –数据同步协议
    create contract[http://oa.founder.com/Data/SyncContract]
    (
    [http://oa.founder.com/Data/Sync]
    sent by initiator,
    [http://oa.founder.com/Data/Sync/Error]
    sent by target
    )
    go

    Use DBTo
    go
    –数据同步—消息类型
    create message type [http://oa.founder.com/Data/Sync]
    validation=well_formed_xml
    go
    –数据同步–错误反馈消息类型
    create message type [http://oa.founder.com/Data/Sync/Error]
    validation=well_formed_xml
    go
    –数据同步协议

    create contract[http://oa.founder.com/Data/SyncContract]
    (
    [http://oa.founder.com/Data/Sync]
    sent by initiator,
    [http://oa.founder.com/Data/Sync/Error]
    sent by target
    )
    Go

    创建过之后效果如下图:

    3.2.4 创建消息队列

    这里主要用来创建消息队列,源数据库和目标数据库都要创建,队列名字可以自主命名。
    

    use DBFrom
    go
    create queue [DBFrom_DataSyncQueue]
    with status=on
    go

    use DBTo
    go
    create queue [DBFrom_DataSyncQueue]
    with status=on
    go

    创建之后效果如下图:

    3.2.5 创建数据同步服务

    这里我们通过利用上边创建的消息协定和消息队列来创建数据同步的服务。

    use DBFrom
    go
    create service [http://oa.founder.com/DBFrom/Data/SyncService]
    on queue dbo.DBFrom_DataSyncQueue
    go

    –数据同步服务
    use DBTo
    go
    create service [http://oa.founder.com/DBTo/Data/SyncService]
    on queue dbo.DBFrom_DataSyncQueue
    go

    创建后效果如下图:
    

    3.2.6 在源数据库上创建服务配置列表

    这里需要在源数据库上创建一个服务配置列表,主要用来保存之前创建过的服务名称,本例只是用来演示,所以只创建了一个服务,只能是同步一个数据表,如果有多个数据表需要同步,则需创建多个服务,所以这里创建一个服务配置列表,用来存储多个服务的服务名称。

    需要注意的是,下面的脚本在执行完创建表的操作之后又插入了一条数据,也就是上边我们创建的服务名,如果有多个服务的话,依次插入该表即可。

    use DBFrom
    go
    –同步数据–目标服务配置
    create table SyncDataFarServices
    (
    ServiceID uniqueidentifier,
    ServiceName nvarchar(256)
    )
    go
    –将上边创建的服务名,插入此表中
    insert into SyncDataFarServices (ServiceID,ServiceName)
    values
    (NEWID(),’http://oa.founder.com/DBTo/Data/SyncService‘)
    go

    效果如下图:

    3.2.7 发送数据同步消息

    这里创建了一个存储过程主要用来发送同步消息,该消息内容主要包括操作类型、主键、表名、正文内容,分别对应@DMLType,@PrimaryKeyField,@TableName,@XMLData。然后通过创建一个游标来条的读取上边创建的服务列表中的列表信息,向不同的服务发送消息。
    

    Use DBFrom
    go
    –发送同步数据消息
    Create procedure UP_SyncDataSendMsg
    (
    @PrimaryKeyField nvarchar(128),
    @TableName nvarchar(128),
    @DMLType char(1),
    @XMLData xml
    )
    as
    begin
    SET @XMLData.modify(‘insert {sql:variable(“@DMLType”)} as first into /’);
    SET @XMLData.modify(‘insert {sql:variable(“@PrimaryKeyField”)} as first into /’);
    SET @XMLData.modify(‘insert

    {sql:variable(“@TableName”)}
    as first into /’);
    DECLARE FarServices CURSOR FOR SELECT ServiceName FROM SyncDataFarServices;
    open FarServices
    declare @FarServiceName nvarchar(256);
    fetch FarServices into @FarServiceName;
    while @@FETCH_STATUS=0
    begin
    begin Transaction
    declare @Conv_Handler uniqueidentifier
    begin DIALOG conversation @Conv_Handler –开始一个会话
    from service [ http://oa.founder.com/DBFrom/Data/SyncService]
    to service @FarServiceName
    on contract [ http://oa.founder.com/Data/SyncContract];
    send on conversation @Conv_Handler
    Message type http://oa.founder.com/Data/Sync;
    fetch FarServices into @FarServiceName;
    commit;
    end
    close FarServices;
    deallocate FarServices;
    end
    go

    3.2.8 创建数据同步异常信息记录表

    这里创建该表主要用来记录在数据同步过程中出现的异常信息。

    use DBFrom
    go
    create Table dbo.SyncException
    (
    ErrorID uniqueidentifier,
    ConversationHandleID uniqueidentifier,
    ErrorNumber int,
    ErrorSeverity int,
    ErrorState int,
    ErrorProcedure nvarchar(126),
    ErrorLine int,
    ErrorMessage nvarchar(2048),
    MessageContent nvarchar(max),
    CreateDate DateTime
    )
    go
    –修改异常信息记录表
    alter table dbo.SyncException
    add
    PrimaryKeyField nvarchar(128),
    TableName nvarchar(128),
    DMLType char(1),
    DBName nvarchar(128)
    Go

    效果如下图:

    3.2.9 数据同步反馈

    这里主要用来在源数据库中接收队列中的消息,将同时出错的信息,解析一下,然后插入到异常信息记录表里边。

    –数据同步回馈

    use DBFrom
    go
    create procedure UP_SyncDataFeedback
    as
    begin
    set nocount on
    –会话变量声明
    declare @ConversationHandle uniqueidentifier;–会话句柄
    declare @Msg_Body nvarchar(max);
    declare @Msg_Type_Name sysname;
    –变量赋值
    while(1=1)
    begin
    begin transaction
    –从队列中接收消息
    waitfor
    (
    receive top(1)
    @Msg_Type_Name=message_type_name,
    @ConversationHandle=[conversation_handle],
    @Msg_Body=message_body
    from dbo.[DBFrom_DataSyncQueue]
    ),timeout 1000
    –如果接收到消息处理,否则跳过
    if(@@ROWCOUNT<=0)
    break;
    if @Msg_Type_Name=’http://schemas.microsoft.com/SQL/ServiceBroker/EndDialog
    end conversation @ConversationHandle;
    else if @Msg_Type_Name=’http://oa.founder.com/Data/Sync/Error
    begin
    declare @DataSource xml;
    set @DataSource=Convert(xml,@Msg_Body);
    insert into dbo.SyncException(ErrorID,ConversationHandleID,ErrorNumber,ErrorSeverity,ErrorState,ErrorProcedure,ErrorLine,ErrorMessage,
    PrimaryKeyField,TableName,DMLType,MessageContent,DBName,CreateDate)
    select
    NEWID(),@ConversationHandle,
    T.c.value(‘./@ErrNumber’,’INT’),
    T.c.value(‘./@ErrSeverity’,’INT’),
    T.c.value(‘./@ErrState’,’INT’),
    T.c.value(‘./@ErrProcedure’,’Nvarchar(126)’),
    T.c.value(‘./@ErrLine’,’INT’),
    T.c.value(‘./@ErrMessage’,’nvarchar(2048)’),
    T.c.value(‘./@PrimaryKeyField’,’nvarchar(128)’),
    T.c.value(‘./@TableName’,’nvarchar(128)’),
    T.c.value(‘./@DMLType’,’char(1)’),
    T.c.value(‘./@MessageContent’,’nvarchar(max)’),
    T.c.value(‘./@DBName’,’nvarchar(128)’),
    GETDATE()
    from @DataSource.nodes(‘/row’) as T(c);
    end
    else if @Msg_Type_Name=’http://schemas.microsoft.com/SQL/ServiceBroker/Error
    end conversation @ConversationHandle;
    commit Transaction;
    end
    end
    commit;
    go

    3.2.10对Service Broker队列使用内部激活,并指定将调用的存储过程

    这里主要用来激活源数据库的消息队列,并为其指定调用的存储过程,即上边3.2.9 中创建的存储过程。
    

    –对Service Broker队列使用内部激活,并指定将调用的存储过程
    use DBFrom
    go
    alter queue dbo.DBFrom_DataSyncQueue with activation
    (
    status=on,
    max_queue_Readers=1,
    procedure_name=UP_SyncDataFeedback,
    execute as owner
    );
    Go

    3.2.11 在源数据库中为需要同步的数据表创建触发器

    这里就以用户表为例,具体操作如下,这里通过查询系统的Inserted和Deleted临时表来判断执行同步的操作类型是更新(U)、新增(A)还是删除(D),最后调用3.2.7 中创建的存储过程来对数据进行处理并发送。

    use DBFrom
    Go
    –用户信息同步
    Create Trigger UT_DataSync_Users
    on dbo.Org_Users
    after insert,update,delete
    as
    set nocount on ;
    –变量声明
    declare @PrimaryKeyField nvarchar(128),@TableName nvarchar(128),@DMLType char(1);
    declare @InsertCount int ,@DeleteCount int ;
    declare @XMLData xml;
    –变量赋值
    set @PrimaryKeyField=’ID’ –组合主键,多个主键使用”,”隔开
    set @TableName=’Org_Users’
    set @InsertCount=(select COUNT(*) from inserted)
    set @DeleteCount=(select COUNT(*) from deleted)
    if @InsertCount=@DeleteCount and @InsertCount<>0 —-Update
    begin
    select @XMLData=(select * from inserted For xml raw,binary base64,ELEMENTS XSINIL);
    set @DMLType=’U’;
    end
    else if(@InsertCount<>0 and @DeleteCount=0) —-Insert
    begin
    select @XMLData=(select * from inserted for xml raw ,Binary base64,ELEMENTS XSINIL)
    set @DMLType=’A’;
    end
    else—-Delete
    begin
    select @XMLData=(select *from deleted for xml raw,binary base64,ELEMENTS XSINIL)
    set @DMLType=’D’;
    end
    if(@XMLData is not null)
    begin
    exec UP_SyncDataSendMsg @PrimaryKeyField,@TableName,@DMLType,@XMLData;
    end
    go

    3.2.12 目标数据库中创建,字符分割函数

    该函数主要是用来进行字符分割,用来处理主键有多个字段的情况。

    –目标数据库

    use DBTo
    go
    –转换用‘,’分割的字符串@str
    create Function dbo.uf_SplitString
    (
    @str nvarchar(max),
    @Separator nchar(1)=’,’
    )
    returns nvarchar(2000)
    as
    begin
    declare @Fields xml;–结果字段列表
    declare @Num int;—–记录循环次数
    declare @Pos int;—–记录开始搜索位置
    declare @NextPos int;–搜索位置临时变量
    declare @FieldValue nvarchar(256);–搜索结果
    set @Num=0;
    set @Pos=1;
    set @Fields=CONVERT(xml,’‘);
    while (@Pos<=LEN(@Str))
    begin
    select @NextPos=CHARINDEX(@Separator,@Str,@Pos)
    if(@NextPos=0 OR @NextPos is null)
    select @NextPos=LEN(@Str)+1;
    select @FieldValue=RTRIM(ltrim(substring(@Str,@Pos,@NextPos-@Pos)))
    select @Pos=@NextPos+1
    set @Num=@Num+1;
    if @FieldValue<> ”
    begin
    set @Fields.modify(‘insert {sql:variable(“@FieldValue”)} as last into /Fields[1]’);
    end
    end
    return Convert(nvarchar(2000),@Fields);
    end
    go

    3.2.13 将解析过的消息信息,根据操作类型的不同同步到数据表中

    这是所有的数据同步中最关键也是最复杂的一步了,在整个开发的过程中,大部分时间都花在这上边了,具体的操作都在下面解释的很清楚了。
    

    –将XML数据源中的数据同步到数据表中(包括增删改)

    Use DBTo
    go
    create function dbo.UF_XMLDataSourceToSQL
    (
    @DataSource XML,–数据源
    @TableName varchar(128),–同步数据表名称
    @PrimaryKeyField varchar(128),–需要同步的表的主键,主键为多个时用‘,’隔开
    @DMLType char(1) –A:新建;U:编辑;D:删除
    )
    returns nvarchar(4000)
    as
    begin
    –变量声明及数据初始化
    –声明数据表@TableName列Column相关信息变量
    declare @ColumnName nvarchar(128),@DataType nvarchar(128),@MaxLength int;
    –声明用于拼接SQL的变量
    declare @FieldsList nvarchar(4000),@QueryStatement nvarchar(4000);
    declare @Sql nvarchar(4000);
    declare @StrLength int;
    –变量初始化
    set @FieldsList=’ ‘;–初始化变量不为null,否则对变量使用’+=’操作符无效
    set @QueryStatement=’ ‘;
    –主键信息,根据参数求解如:ID1ID2
    declare @PKs xml;
    –当前字段是否主键-在‘更新’,‘删除’同步数据时使用
    declare @IsPK nvarchar(128);
    –初始化游标–游标内容包括目标数据表TableName列信息
    DECLARE ColumnNameList CURSOR FOR SELECT COLUMN_NAME,DATA_TYPE,CHARACTER_MAXIMUM_LENGTH FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME=@TableName AND
    DATA_TYPE<>’xml’;
    –数据处理
    if @DMLType=’A’–插入数据
    begin
    open ColumnNameList
    fetch ColumnNameList into @ColumnName,@DataType,@MaxLength;
    while @@FETCH_STATUS=0
    begin
    –判断数据源列中是否存在属性:@ColumnName
    –判断数据源列中是否存在–元素:@ColumnName
    If @DataSource.exist(‘/row/*[local-name()=sql:variable(“@ColumnName”)]’)=1
    begin
    –拼接SQL
    set @FieldsList+=(@ColumnName+’,’);
    set @QueryStatement+=(‘T.c.value(”(./’+@ColumnName+’[not(@xsi:nil)])[1]”,”’+@DataType);–元素读取(包含空值情况)
    if @MaxLength is not null and @MaxLength<>-1
    begin
    set @QueryStatement+=’(‘+CONVERT(nvarchar,@MaxLength)+’)’;
    end
    else if @MaxLength=-1 and @DataType<>’xml’–已调整
    begin
    set @QueryStatement+=’(MAX)’;
    end
    set @QueryStatement+=(”’) as ‘+@ColumnName+’,’);
    end
    fetch ColumnNameList into @ColumnName,@DataType,@MaxLength
    end
    close ColumnNameList;
    deallocate ColumnNameList;
    set @StrLength=LEN(@FieldsList);
    –去掉@FieldsList结尾的’,’
    set @FieldsList=SUBSTRING(@FieldsList,1,@StrLength-1);
    set @StrLength=LEN(@QueryStatement);
    –去掉@QueryStatement结尾的’,’
    set @QueryStatement=SUBSTRING(@QueryStatement,1,@StrLength-1);
    set @Sql=N’insert into ‘+@TableName+’(‘+@FieldsList+’) select ‘+@QueryStatement+’ from @DataSource.nodes(”/row/”) as T(c)’;
    end

    else if @DMLType='U'--更新数据
        begin
           --更新语句where 后的条件表达式
           declare @Condition nvarchar(1000);
           set @Condition='  ';
           set @PKs=CONVERT(xml,dbo.uf_SplitString(@PrimaryKeyField,','));
           Open ColumnNameList
                fetch ColumnNameList into @ColumnName,@DataType,@MaxLength;
               while @@FETCH_STATUS=0
                begin
                --判断数据源列中是否存在元素:@ColumnName
                  if @DataSource.exist('/row/*[local-name()=sql:variable("@ColumnName")]')=1
                  begin
                     set @IsPK=null;
                     SELECT @IsPk=Fs.F FROM (SELECT T.c.value('.[text()]','Nvarchar(128)') AS F FROM @PKs.nodes('/Fields/Field') AS T(c))Fs Where Fs.F=@ColumnName
                     if @IsPK is null or @IsPK=''
                     begin
                       --非主键,更新字段值
                       set @FieldsList+=(@ColumnName+'=Source.'+@ColumnName+',');
                     end
                     else
                     begin
                        --主键,作为要更新条件
                       set @Condition+=@TableName+'.'+@ColumnName+'=Source.'+@ColumnName+' And ';
                     end
                     --XML查询
                     set @QueryStatement+=('T.c.value(''(./'+@ColumnName+'[not(@xsi:nil)])[1]'','''+@DataType);--元素读取(包含空值情况)
                     if @MaxLength is not null and @MaxLength<>-1
                        begin
                           set @QueryStatement+='('+CONVERT(nvarchar,@MaxLength)+')';
                        end
                     else if @MaxLength=-1 and @DataType<>'xml'
                        begin
                           set @QueryStatement+='(max)';
                        end
                      set @QueryStatement+=(''') as '+@ColumnName+',');
                  end
                  fetch ColumnNameList Into @ColumnName,@DataType,@MaxLength
                end
            close ColumnNameList;
            Deallocate ColumnNameList;          
            --去掉@FieldsList结尾的','
            set @StrLength=LEN(@FieldsList);
            set @FieldsList=SUBSTRING(@FieldsList,1,@StrLength-1);        
         --去掉@QueryStatement结尾的','
         set @StrLength=LEN(@QueryStatement);
         set @QueryStatement=SUBSTRING(@QueryStatement,1,@StrLength-1);
         --去掉@Condition结尾的‘and'
         set @StrLength=LEN(rtrim(@Condition));
         set @Condition=SUBSTRING(rtrim(@Condition),1,@StrLength-3);           
            set @Sql=N'USE DBTo ; update '+@TableName+' set '+@FieldsList+' from (select '+@QueryStatement+' 
            from @DataSource.nodes(''/row'') as T(c)) Source where '+@Condition;
    end  
    else if @DMLType='D' --删除数据
       begin
         --更新语句where后的条件表达式
         declare @LinkField nvarchar(1000);
         set @LinkField='  ';
         set @PKs=CONVERT(xml,dbo.uf_SplistString(@PrimaryKeyField,','));
         open ColumnNameList
            fetch ColumnNameList into @ColumnName,@DataType,@MaxLength;
            while @@FETCH_STATUS=0
            begin
            if @DataSource.exist('row/*[local-name()=sql:variable("@ColumnName")]')=1
             begin
              set @IsPK=null;--初始化
              --当前字段是否为主键
              select @IsPK=Fs.F from (select T.c.value('.[text()]','nvarchar(128)') as F from @PKs.nodes('/Fields/Field') as T(c))Fs where Fs.F=@ColumnName
              --主键
              if @IsPK is not null and @IsPK<>''
              begin
                 --主键删除条件
                 set @LinkField+='Target.'+@ColumnName+'=Source.'+@ColumnName+' And ';
                 --XML 查询
                 set @QueryStatement+=('T.c.value(''(./'+@ColumnName+'[not(@xsi:nil)])[1]'','''+@DataType);--元素读取(包含空值情况)
                if(@MaxLength is not null and @MaxLength<>-1)
                   begin
                      set @QueryStatement+='('+CONVERT(nvarchar,@MaxLength)+')';
                   end
                else if @MaxLength=-1 and @DataType<>'xml'
                   begin
                   set @QueryStatement+='(max)';
                  end
                set @QueryStatement+=(''') as '+@ColumnName+',');
              end 
             end
            fetch ColumnNameList into @ColumnName,@DataType,@MaxLength
            end
            close ColumnNameList;
            deallocate ColumnNameList;         
            --去除@QueryStateMent结尾的','
            set @StrLength=LEN(@QueryStatement);
            set @QueryStatement=SUBSTRING(@QueryStatement,1,@StrLength-1);          
            --去除@LinkField 结尾的’Add‘
            set @StrLength=LEN(rtrim(@LinkField));
            set @LinkField=SUBSTRING(rtrim(@LinkField),1,@StrLength-3);         
            set @Sql=N'Delete from '+@TableName+' from '+@TableName+' as Target inner join (select '+@QueryStatement+ ' from @DataSource.nodes(''/row'') as T(c))
    

    Source on ‘+@LinkField;
    end
    Return @Sql–‘hello’
    end
    go

    3.2.14 解析并处理从队列中读取的消息

    这里主要用来读取队列中的消息,并将消息进行处理,最终处理成一定的格式,并调用3.2.13中的存储过程,将数据同步到数据库中。

    –将数据同步到数据表中
    create procedure UP_SyncDataToTable
    as
    begin
    set nocount on
    –会话变量声明
    declare @ConversationHandle uniqueidentifier;–会话句柄
    declare @Msg_Body nvarchar(max);
    declare @Msg_Type_Name sysname;
    declare @ErrorNumber int ;
    –变量赋值
    while(1=1)
    begin
    begin transaction
    –从队列中接收消息
    waitfor
    (
    receive top(1)
    @Msg_Type_Name=message_type_name,
    @ConversationHandle=[conversation_handle],
    @Msg_Body=message_body
    – from dbo.[DBTo_DataSyncQueue]
    from dbo.[DBFrom_DataSyncQueue]
    ),timeout 500
    –如果接收到消息-处理,否则跳过
    if @@ROWCOUNT<=0
    begin
    break;
    end
    if @Msg_Type_Name=’http://oa.founder.com/Data/Sync
    begin
    –声明变量
    declare @DMLType char(1);
    declare @PrimaryKeyField nvarchar(128),@TableName nvarchar(128),@Sql nvarchar(4000);
    declare @DataSource xml
    –受影响的行数
    declare @EffectRowCount int;
    declare @ErrMsg xml;
    begin try
    –变量赋值
    set @DataSource=convert(xml,@Msg_Body);–数据源
    set @PrimaryKeyField=@DataSource.value(‘(/PrimaryKeyField)[1][text()]’,’nvarchar(128)’);–主键列表
    set @TableName=@DataSource.value(‘(/Table)[1][text()]’,’nvarchar(128)’);–操作数据表
    set @DMLType=@DataSource.value(‘/DMLType[1][text()]’,’char(1)’);–操作类型
    set @Sql=dbo.UF_XMLDataSourceToSQL(@DataSource,@TableName,@PrimaryKeyField,@DMLType);
    exec sp_executesql @Sql,
    N’@DataSource XML’,
    @DataSource;
    end try
    begin catch
    declare @DBName nvarchar(128)
    select @DBName=Name from master..SysDataBases where dbid=(select dbid from master..sysprocesses where spid=@@SPID)
    set @ErrorNumber=ERROR_NUMBER();
    set @ErrMsg=(select ERROR_NUMBER() as ErrNumber,
    ERROR_SEVERITY() as ErrSeverity,
    ERROR_STATE() as ErrState,
    ERROR_PROCEDURE() as ErrProcedure,
    ERROR_LINE() as ErrLine,
    ERROR_MESSAGE() as ErrMessage,
    @PrimaryKeyField as PrimaryKeyField,
    @TableName as TableName,
    @DMLType as DMLType,
    @Msg_Body as MessageContent,
    @DBName as DBName
    for XML raw);
    –GOTO 错误处理标签
    goto Err_Handle;
    end catch
    –结束会话
    End Conversation @ConversationHandle
    if @ErrorNumber is not null
    begin
    –错误处理区域
    Err_Handle:
    if @ErrMsg is not null
    begin
    declare @test nvarchar(128);
    –发送失败消息
    send on conversation @ConversationHandle
    message type http://oa.founder.com/Data/Sync/Error
    end
    –结束会话
    end conversation @ConversationHandle
    –break;
    –回滚–不可回滚,否则将无法发送失败消息
    –GoTO Err_Lab;
    end
    end
    commit transaction
    end
    end
    go

    3.2.15 对目标数据库的消息队列进行内部激活

    这里主要是用来激活目标数据库的消息队列,主要用来实现数据的同步以及同步出错的错误信息的反馈。

    –对Service Broker队列使用内部激活,并指定将要调用的存储过程
    use DBTo
    go
    –alter Queue dbo.[DBTo_DataSyncQueue] with activation
    alter Queue dbo.[DBFrom_DataSyncQueue] with activation
    (
    status=on,
    max_queue_readers=1,
    Procedure_name=UP_SyncDataToTable,
    Execute as self
    )
    Go

    完成以上这些步骤以后,就可以实现同一数据库实例上两个不同的数据库之间的数据同步。即如果DBFrom数据库中的Org_Users中的某一条信息发生变化,会马上的自动同步到DBTo数据库中的Org_Users 表。如果是想要实现不同的数据库实例间的数据库的表的同步,则可以参考以下链接:
    

    http://www.cnblogs.com/downmoon/archive/2011/05/05/2037830.html

    在创建启用传输安全、对话安全,创建路由、远程服务绑定等额外的操作之后,剩下的操作跟在同一数据库实例中的操作是一样的。

       此外,本文还参考了如下的链接:
    

    http://www.cnblogs.com/downmoon/archive/2011/04/05/2005900.html

       希望可以给大家一些启发和帮助。具体的源码有兴趣的朋友可以留下邮箱。
    
    展开全文
  • 信息系统的普及应用导致原有系统间的信息孤岛需要通过系统间接口进行数据交互,信息交互的接口常见以下几种: (1)数据库交互:服务方提供表或存储过程,由调用方控制commit或rollback。 (2)文件交互:双方对请求...
  • 在集群中同步时间有着十分重要的作用,负载均衡集群或高可用集群如果时间不一致,在服务器之间的数据误差就会很大,寻找数据便会成为一件棘手的事情。备份是一个合格的运维工程师的基本功,若是时间无法同步,那么就...
  • 应用系统之间数据传递的几种方式

    万次阅读 2016-09-20 21:16:13
    本文转载自sina_blog(siangzhang) 随着近年来SOA(面向服务技术架构)的兴起,越来越多的应用系统开始进行分布式的设计和部署。 系统由原来单一的技术架构变成面向服务的多系统...应用系统之间数据传输三个要素
  •  客服QQ1793040 ----------------------------------------------------------     ...关于HKROnline SyncNavigator 注册机价格...HKROnline SyncNavigator 8.4.1 企业版数据同步软件 自2009年第一个版本开发...
  • 在网络通信过程中,通信双方要交换数据,需要高度的协同工作。为了正确的解释信号,接收方必须确切地...通常可以采用同步或异步的传输方式对位进行同步处理。 1. 异步传输(Asynchronous Transmission):异步传输...
  • 两台Linux系统之间传输文件的几种方法

    万次阅读 多人点赞 2016-06-14 17:11:23
    scp传输当两台LINUX主机之间要互传文件时可使用SCP命令来实现scp传输速度较慢,但使用ssh通道保证了传输的安全性复制文件 将本地文件拷贝到远程 scp 文件名 –用户名@计算机IP或者计算机名称:远程路径 从远程将文件拷...
  • 特点是它可以灵活的通过SQL的方式进行数据库之间同步操作。可以在制定的时间时间作为任务计划自动执行。缺点是需要写SQL来进行操作。 既然是数据库之间同步就涉及到数据库之间连接。建立连接同步的第一步。...
  • 应用系统之间数据传输的几种方案

    万次阅读 2017-11-21 11:39:19
    应用系统之间数据传输的几种方式 第一种方案:socket方式 Socket方式是最简单的交互方式。是典型才C/S交互模式。一台客户机,一台服务器。 服务器提供服务,通过IP地址和端口进行服务访问。而客户机通过连接...
  •  客服QQ1793040 ----------------------------------------------------------     ...关于HKROnline SyncNavigator 注册机价格...HKROnline SyncNavigator 8.4.1 企业版数据同步软件 自2009年第一个版本开发...
  • 进程间通信——几种方式的比较和详细实例

    万次阅读 多人点赞 2017-11-14 09:42:47
    2、几种通信方式的比较 3、几种通信方式的详细实例 1、进程间通信的定义 进程间通信就是在不同进程之间传播或交换信息,那么不同进程之间存在着什么双方都可以访问的介质呢?进程的用户空间是互相独立的,一般...
  • UE4网络同步(二)——深入同步细节

    万次阅读 多人点赞 2017-10-29 11:54:18
    我这里主要是从同步的流程分析,以同步的机制为讲解核心,给大家描述里面是怎么同步的,会大量涉及UE同步模块的底层代码,稍微涉及一点计算机网络底层(Socket相关)相关的知识。 PS:如果只是想知道怎么使用同步,...
  • java线程同步的实现方式

    千次阅读 2019-03-08 01:47:21
    这里抛砖引玉,为何要使用同步?...下面总结一些java线程实现同步方式,大致下面几种: 1.同步方法 使用 synchronized关键字,可以修饰普通方法、静态方法,以及语句块。由于java的每个对象都一个内置锁...
  • UE4网络同步详解(一)——理解同步规则

    万次阅读 多人点赞 2017-10-15 21:41:40
    对于新手理解UE的同步机制非常帮助,对于一定的基础而没有深入的UE程序也或许一些启发。如果想深入了解同步的实现原理,可以参考UE4网络同步(二)——深入同步细节 问题一:如何理解Actor与其所属连接? ...
  • Elasticsearch的连接方式+三客户端

    万次阅读 2018-08-20 15:18:33
    所有语言 所有语言可以使用RESTful API 通过端口9200和 Elasticsearch 进行通信,你可以用你最喜爱的 web 客户端访问 Elasticsearch 。...HTTP在大多数编程语言中得到很好的支持,这是连接到Elas...
  • 线程同步互斥的4种方式

    万次阅读 多人点赞 2018-06-19 22:48:34
    种方式 1.  临界区(Critical Section ):适合一个进程内的多线程访问 公共区域 或代码段时使用 2.  互斥量 (Mutex) :适合不同进程内多线程访问 公共区域 或代码段时使用,与临界区相似。 3.  事件...
  • 线程的7状态及相互转换(图)以及关于线程同步(7种同步方式
  • 连接,短连接同步,异步

    千次阅读 2010-09-27 21:24:00
    而长连接通常就是: 连接-》数据传输-》保持连接-》数据传输-》保持连接-》…………-》关闭连接; 这就要求长连接在没有数据通信时,定时发送数据包,以维持连接状态,短连接在没有数据传输时直接...
  • 数据库同步有3大难题: 1是如何保障目标和源数据一致性; 2是异构数据库如何做数据类型转换,导致数据同步失败的原因常常是因为数据类型不一样; 3是在数据越实时越价值的背景下,同步过程中能否做到实时同步
  • 一。...2.多个Client方连接一个Server方,这也是通常的并发服务器方式。 3.一个Client方连接多个Server方,这种方式很少见,主要 用于一个客户向多个服务器发送请求情况。 (二)连接方式 1.
  • 进程同步和通信 ...为了实现对并发进程的有效管理,在多道程序系统中引入了同步机制,常见的同步机制:硬件同步机制、信号量机制、管程机制等,利用它们确保程序执行的可再现性; 进程同步的基本概念 ...
  • 一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到M字节之间 共享数据 多个进程想要操作共享数据,一个进程对共享数据 通知事 一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了...
  • 下面介绍的就是数据库同步的两种方式:  1、SQL JOB的方式   sql Job的方式同步数据库就是通过SQL语句,将一个数据源中的数据同步到目标数据库中。特点是它可以灵活的通过SQL的方式进行数据库之间同步操作。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 261,697
精华内容 104,678
关键字:

同步网之间的连接方式有几种