通过BizTalk WCF适配器实现异构数据库/系统间的数据同步
概述
数据库与数据库之间的同步,是EAI(企业应用整合)非常普遍的需求,BizTalk作为企业ESB平台,以SOA的架构方式来实现异构系统之间的整合,今天我们就来介绍如何使用BizTalk的适配器来实现数据库与数据库之间的数据同步。
在本篇文章当中,我以SQL Server到SQL Server之间同步来举例,用到了BizTalk的WCF-SQL适配器。
在这里说明一下,若需要与其他数据库进行同步,如SQL Server到Oracle、Oracle到IBM DB2的实现方式大体相同,只是所选用的适配器与连接配置有少许不同而已。
简单步骤我就直接用文字来描述了,之前的很多文章贴过简单步骤的贴图,在这里只把关键步骤的截图贴出来,废话不多说,直接切入正题。
示例程序
场景介绍
场景非常简单,我们要实现的就是将源表中的3条数据通过BizTalk导入到目标表当中。
使用WCF-SQL获取源数据表中的信息
- 在Visual Studio 2010中创建BizTalk解决方案,并命名为SQL_TO_SQL;
- Add Generated Items选择Consume Adapter Service点击Add;
- 选择sqlBinding并点击右边的Configure按钮;
- 在Security选项卡中,选择SQL Server的安全认证方式,在这里我们用Username认证方式,填写用户名和密码;
- 在URI Properties选项卡中配置Server为localhost、InitialCatalog为数据库TestDB、InboundId为TestID;
说明一下InboundId,在这里我们采用轮询的方式来获取SQL源数据表当中的数据,选择这种方式我们必须指定InboundId来确保命名空间是唯一的,这个InboundId不能与其他的项目中的InboundId重复。 - 在Binding Properties选项卡中,配置InboundOperation Type选择TypedPolling,PolledDataAvailable Statement为SELECT COUNT(1) FROM Source_Table,PollingStatement为SELECT Source_ID,Source_Name,Source_Time FROM Source_Table;
InboundOperationType – 属性有几种类型可选:Polling,TypedPolling,Notification。
Polling是轮询方式,但是这种方式是不带架构的,TypedPolling也是轮询方式,这种方式可以带出架构。Notification是用于数据有变化时进行相关通知。
如果需要轮询数据,又要能刷出数据架构,需要采用TypedPolling方式。
PollingIntervalInSecond – 轮询间隔时间。
PolledDataAvailableStatement – 执行轮询的条件,这里一般是个select语句,这条语句应该返回一个单个的结果集,只要这个结果集的第一行第一列必须有值(如果是空结果集会报错),应该是个大于等于0的整数值。如果这个值大于0则执行下面PollingStatement指定的SQL命令真正的开始轮询的操作。如果这个值等于0,则轮询语句不执行。
PollingStatement – 轮询命令,可以是SQL语句,也可以是存储过程。 - 在Select Contract type中选择Service (Inbound operations),并选择TypedPolling;
- 可以看到在项目中生成了2个文件,1个是根据前面设置的轮询命令生成的Schema,1个是可以导入到BizTalk的接收位置和端口的XML绑定文件;
使用WCF-SQL向目标数据表插入数据
- Add Generated Items选择Consume Adapter Service点击Add;
- 选择sqlBinding并点击右边的Configure按钮;
- 在Security选项卡中,选择SQL Server的安全认证方式,在这里我们用Username认证方式,填写用户名和密码;
- 在URI Properties选项卡中配置Server为localhost、InitialCatalog为数据库TestDB、InboundId为TestID;
- 在Binding Properties选项卡中我们不需要配置TypedPolling,应当将其恢复为初始状态;
- 配置好之后选择Tables当中的Destination_Table表并添加Insert操作,在Filename Prefix处可为其设置命名前缀,这个地方不是必须填的,但是我们在这里将其设置为INSERTDES以保证文件命名更加整洁;
- 配置完成后,可以看到在项目中生成了4个文件,3个是根据前面设置的Insert命令生成的Schema,1个是可以导入到BizTalk的接收位置和端口的XML绑定文件;
- 对该解决方案进行编译。
创建并配置BizTalk业务流程
- 添加BizTalk Orchestration文件并将其命名为Orchestration_SQLtoSQL;
- 在Orchestration View中右键Messages->New Message添加消息,将其命名为Msg_GetData,并设置Message Type为SQL_TO_SQL.TypedPolling_TestID.TypedPolling;
- 按照上述方法创建另一个消息,命名为Msg_SendData,将Message Type设置为SQL_TO_SQL.INSERTDESTableOperation_dbo_Destination_Table.Insert;
- 创建好接收消息和发送消息之后,按照如下图所示搭建业务流程并配置数据表之间的映射关系;
部署并配置BizTalk应用程序
- 右键BizTalk解决方案对其进行部署,发布到BizTalk管理控制台当中,在控制台当中找到所发布的BizTalk的应用程序,右键点击Configure...;
- Host选择BizTalkServerApplication;
- 配置接收端口;
- 将接收端口命名为GetSQLPort,并新建接收位置,配置其接收位置为WCF-SQL适配器,接收管道选择XMLReceive;
- 在WCF-SQL右侧点击Configure...配置适配器属性,配置内容与在Visual Studio中需保持一致,Server为localhost、InitialCatalog为TestDB、InboundId为TestID,最后生成的URI为mssql://localhost//TestDB?InboundId=TestID;
- 在Binding选项卡中的配置见Visual Studio中接收端口的配置;
- 在Other选项卡中选择User account方式来配置登陆信息;
- 配置发送端口;
- 将发送端口命名为SendSQLPort,选择WCF-SQL适配器,发送管道使用默认的PassThruTransmit,同样点击Configure...来配置WCF-SQL适配器;
- 在这里要注意,发送端口不用配置InboundId这一项,生成的URI最终应为mssql://localhost//TestDB?才是正确的;
- 在Binding选项卡中暂不做任何配置;
- 在Credentials选项卡中配置数据库登录信息,并且该登录用户必须拥有目标数据表的写权限;
- 配置完成后点击OK并启动BizTalk应用程序,其运行结果如下图所示,至此我们已经成功地将源数据表中的数据导入到目标表当中了,这里我们设置的轮询时间间隔为30秒一次,可根据业务需求作出相应的配置,并且该Demo不仅仅局限于SQL到SQL之间的同步,若想与其他数据库同步,则在配置时选用其它数据库的适配器即可,如:WCF-OracleDB;