锁定老帖子 主题:通用数据抽取系统
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (1)
|
|
---|---|
作者 | 正文 |
发表时间:2008-09-17
最后修改:2010-05-04
基于文件,Web Service服务,数据库数据之间的数据导入与导出,全部的数据交换过程通过XML配置文件来完成,并且提供XML配置文件客户端方便编写,这是我在做项目过程中因为频繁处理数据交换而做的一个小系统,希望对大家有用 <!----> 数据抽取配置文件说明(初稿)<!---->1. <!---->定义数据源 在根节点 <extra-config> 下定义 1 - N 个数据源信息,而数据源的类型包括以下三种 , 则对应的属性设置也有所不同,这是数据抽取的基础,必须设置准确无误,如下: <!---->Ø <!---->JDBC 连接 这是最普遍的使用方式 , 所有的参数设置根据名称也一目了然,具体的说明如下: name: 数据源名称 connection-driver :数据库驱动 username :数据库登陆用户名(可加密) password :密码(可加密) url :数据库的 URL 连接字符串 dbtype :数据库类型,目前此参数做保留用,留待以后异构数据库之间抽取数据时使用,建议你将此参数填上,这样有利于结构清晰,可填的数据库类型为: ORACLE,SQLSERVER,DB2,ACCESS , PI 等 <!---->Ø <!---->XML 这种数据源的设置主要用在源数据源为 XML 文件的情况,则相应的参数意义有所变化,如下: name: 数据源名称 connection-driver :填入常数 XML username :可不填,无效 password :可不填,无效 url : XML 文件所在的目录 dbtype :填入常数 file <!---->Ø <!---->WEB SERVICE 这种数据源的设置主要用在向外部 INTERNET 提供内部服务或者不能通过 JDBC 直连的情况,考虑到要绕过防火墙,所以使用目前流行的 WEB SERVICE 技术,具体的参数设置如下: name: 数据源名称 connection-driver : WS 服务端的 JDBC 的驱动字串 username : WS 服务端的 JDBC 连接的用户名(可加密) password : WS 服务端的 JDBC 连接的密码(可加密) url : WS 服务端的 JDBC 连接的 URL endpoint : SOAP 所在路径 dbtype :填入以 WS: 或者 WP: 开头,后跟数据库类型的字符串,如 WS:ORACLE 或者 WP:ORACLE ,其中 WP 开头的是 WEB SERVICE 抽取数据的分页形式,以便抽取大记录集的情况。如果以 WP :开头,则应该写入分页的每页记录数,缺省为 100 ,如输入: WP:ORACLE:100
WEB SERVICE 如果发布到应用服务器上,请参看附录。
特别注意: XML , WEB SERVICE 的数据源设置方式只针对源数据源的设置。如果你将目的数据源设置为这两种方式,系统将退出数据抽取操作。
<!---->2. <!---->定义任务 定义 1 - N 个任务,如下: <task id="ID1" name=" 测试 1" srcds="EPDSM" desds="FC"> <etra-class class="classa"/> <etra-class class="classb"/> </task> 约定:在任务下可以定义 1 - N 个实现类,如以上语句定义了两个实现类。 Srcds , desds :源数据源和目的数据源的名称,与“定义数据源”中的名称要对应。 Name :任务名称。 Auto: 是否自动,其中 1 表示自动,其他手动。注意:目前可用的 JDBC 为两种,具体的配置方法看实例。其中 INET 用于大数据集的抽取, INET 比 ORACLE 驱动普遍速度快 8 - 10 倍,一般情况下建议使用 INET 驱动。 <!---->3. <!---->定义实现类 <etra-class name="classa" type="longshine.extra.GenEtra"> <!- 该模块将被处理 - à <etra-module enable="true"> <etra-class-param name="from" value="SELECT 语句 "/> <etra-class-param name="to" value="INSERT 语句 "/> <etra-class-param name="pk" value="INSERT 语句 "/> </etra-module> <!- 该模块将被处理 - à <etra-module> <etra-class-param name="from" value="SELECT 语句 "/> <etra-class-param name="to" value="INSERT 语句 "/> <etra-class-param name="pk" value="INSERT 语句 "/> </etra-module> <!- 该模块将不被处理 - à <etra-module enable=”false”> <etra-class-param name="from" value="SELECT 语句 "/> <etra-class-param name="to" value="INSERT 语句 "/> <etra-class-param name="pk" value="INSERT 语句 "/> </etra-module> </etra-class> 约定:在实现类下可以定义 1-N 个实现类的抽取模块, 其中 name :定义实现类名,与任务中的类名对应, type :定义实现类的全名,如果你是简单的数据抽取应用,如记录集到记录集的抽取,可以直接写成 longshine.extra.GenEtra ,如果涉及到复杂的数据抽取,必须实现写实现类,如负荷预测库的实现类 ComEtra 类。
Enable :表示该模块是否在当前抽取中可用,默认为可用。
etra-class-param :定义参数,这里可以定义三种类型的参数: from,to,pk , PK 参数可缺省不定义,这个参数仅仅用在需要对已存在的记录进行更新操作时要用到,其中 pk 参数填入的值为目的数据库对应的表的关键字字段,如果为多个,则用 , 隔开。 除非有必要一定要这么抽取数据,否则我们不建议你定义这个参数,定义这个参数后,系统的抽取进度将大大减慢。 在 WS 方式下, from 参数的定义可以使用 ID ,这个 ID 通过 wssqls 段来寻找相应的 SQL 语句,这样可以在 WS 发布方和客户端的 SQL 的分离和透明,定义 from 的 value 时,在这种情况下,一定要以 ID: 打头,并且区分大小写。 特别注意 : 如果你需要进行如 create table 等 DDL 语句 , 并且不需要用到源连接 , 则你无须定义 from 属性 , 系统会自动据此来执行相应的 DDL 语句。此功能只适用于 GenEtra 实现类。并且是非 web service 方式。
如果数据源为 XML 文件,则 FROM 属性有所变化,如不为空,则根据执行的文件名执行,如 H_2005051114 ,则数据直接从这个 XML 文件读取,而后按间隔的指定时间(如每隔一个小时)读取下一 XML 文件, H_2005051115 , H_2005051116 ……,如为空,则按当前的小时读取,接下来按指定的时间间隔读取,这样的处理方式是为了和先前数据源为数据库的方式兼容。请特别注意:如果数据源为 XML ,则实现类的模块定义必须为 1 个。
<!---->4. <!---->其他注意事项 <!---->Ø <!---->在进行数据抽取前,必须保证数据源定义的正确,这里包括源数据源和目的数据源都必须能得到正确的数据库驱动加载程序。 <!---->Ø <!---->由于 XML 语法本身的关系,在书写 SQL 语句中,务必要注意在书写类似 < 或者 > 符号时,必须书写成 < > 方式。具体的特殊语法可参看任何一本XML 语法规范书。 <!---->Ø <!---->XML 文件必须严格按照指定的方式编写,请在抽取数据之前仔细检查 XML 文件的正确性。 <!---->Ø <!---->务必注意任务中定义的实现类必须在 classes 块中对此实现类进行定义,否则系统会出错。
建议:使用我们提供的 data.xml 检验工具小软件来书写该文件,并按 F8 快捷键进行文件的检验,检验通过后再进行数据抽取操作,特别注意:检验通过的 data.xml 并不保证能正确执行数据抽取操作,这还要取决于你书写的 SQL 的正确性。
<!---->5. <!---->详细实例 该实例涵盖了基本所有的数据抽取功能,包括所有的数据源的配置方法,实现类定义方法,任务定义方法等
<?xml version = '1.0' encoding = 'GBK'?> <extra-config> <data-sources>
<!--ORACLE JDBC --> <data-source name="FC" connection-driver="oracle.jdbc.driver.OracleDriver" username="fc" password="fc" url="jdbc:oracle:thin:@172.20.112.148:1521:epcrm" dbtype="ORACLE"/> <data-source name="EPDSM" connection-driver="oracle.jdbc.driver.OracleDriver" username="epdsm" password="epdsm" url="jdbc:oracle:thin:@172.20.112.148:1521:epcrm" dbtype="ORACLE"/> <data-source name="CESHI1" connection-driver="oracle.jdbc.driver.OracleDriver" username="epdsm" password="epdsm" url="jdbc:oracle:thin:@172.20.112.148:1521:epcrm" dbtype="ORACLE"/> <data-source name="CESHI2" connection-driver="oracle.jdbc.driver.OracleDriver" username="epdsm" password="epdsm" url="jdbc:oracle:thin:@172.20.112.148:1521:epcrm" dbtype="ORACLE"/>
<!-- INET JDBC 超过百万的数据抽取一定要用这个驱动 --> <data-source name="SQLSERVERTEST" connection-driver="com.inet.tds.TdsDriver" username="dlyx" password="dlyx" url="jdbc:inetdae7:172.20.0.200:1433?database=fktl" dbtype="SQLSERVER"/> <data-source name="INETORADES" connection-driver="com.inet.ora.OraDriver" username="fc" password="fc" url="jdbc:inetora:172.20.112.148:1521:epcrm" dbtype="ORACLE"/> <data-source name="INETORASRC" connection-driver="com.inet.ora.OraDriver" username="epdsm" password="epdsm" url="jdbc:inetora:172.20.112.148:1521:epcrm" dbtype="ORACLE"/>
<!--XML 文件的数据源的配置 --> <data-source name="FXML" connection-driver="xml" username="username" password="xml" url="newdata\datah" dbtype="file"/>
<!--WEB SERVICE 的数据源的配置 --> <data-source name="WSTEST" connection-driver="" username="" password="" url="http://172.20.99.101:9001/WS_FC-extra-context-root/LSGetRs" dbtype="WS:ORACLE"/> </data-sources> <etra-classes> <!-- 一般的数据抽取实现类定义 --> <etra-class name="genclass" type="longshine.extra.GenEtra"> <etra-module enable="true"> <etra-class-param name="from" value="select dept4_id,custor_id,custname,custaddr,eptype2_id,volt_id, trade4_id,capacity,produce_mode from dw_f_custor where capacity>315 and dept4_id is not null"/> <etra-class-param name="to" value="insert into cust_info(compno,custid,name,address,eptype_id, volt_id,trade_id,capacity,produce_mode)values(?,?,?,?,?,?,?,?,?)"/> </etra-module> </etra-class>
<!--WEB SERVICE 的实现类定义 , 其中 SQL 传递的是 ID 号 --> <etra-class name="wsclaassbyid" type="longshine.extra.GenEtra"> <etra-module> <etra-class-param name="from" value="ID:id1"/> <etra-class-param name="to" value="insert into temptbl (str) values(?)"/> <!— 定义的 line_info 表的关键字字段,这样对存在表中的记录将做更新操作 --> <etra-class-param name="pk" value="compno,lineid"/> </etra-module> <!--WEB SERVICE 的实现类定义 --> <etra-class name="wsclass" type="longshine.extra.GenEtra"> <etra-module> <etra-class-param name="from" value="select substation_id,line_no,line_name,line_cap from opc_line_info"/> <etra-class-param name="to" value="insert into line_info(compno,lineid,name,cap) values(?,?,?,?)"/> <!— 定义的 line_info 表的关键字字段,这样对存在表中的记录将做更新操作 --> <etra-class-param name="pk" value="compno,lineid"/> </etra-module> <!—DDL 语句定义 --> <etra-module enable="true"> <etra-class-param name="to" value="create table a_test(varchar(20))"/> </etra-module> </etra-class>
<!-- 复杂实现类的定义 --> <etra-class name="comclass" type="longshine.extra.ComEtra"/>
<!--XML 文件为数据源的实现类定义 --> <etra-class name="xmlclass" type="longshine.extra.XmlEtra"> <etra-module enable="true"> <etra-class-param name="from" value="h_2005051114"/> <etra-class-param name="to" value="insert into DD_DLB(XLBH,RQ,FDL,GDL,PDL)VALUES(?,?,?,?,?)"/> </etra-module> </etra-class>
</etra-classes>
<tasks> <task id="genTask" name=" 测试 1" system=" 一般任务 " srcds="EPDSM" desds="FC"> <etra-class class="genclass"/> </task> <task id="comTask" name=" 测试 2" system=" 复杂任务 " srcds="EPDSM" desds="FC"> <etra-class class="comclass"/> </task> <task id="WSTask" name=" 测试 3" system="WEB SERVICE 任务 " srcds="EPDSM" desds="FC"> <etra-class class="wsclass"/> </task> <task id="XMLTask" name=" 测试 4" system="XML 任务 " srcds="EPDSM" desds="FC"> <etra-class class="xmlclass"/> </task> </tasks> <wssqls> <sql id=”id1” value=”select dept from tj_aa_bm”/> <sql id=”id2” value=”select custor_id from dw_f_custor”/> </wssqls> </extra-config>
<!---->
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-10-05
说实话,配置好复杂。最好有个良好的可操作界面就方便使用了
|
|
返回顶楼 | |
发表时间:2008-10-05
看了半天也没能明白,配置抽取任务生成的xml文件到底是应该按照日期、小时方式命名,还是就是data.xml?
|
|
返回顶楼 | |
发表时间:2008-10-06
guwei0530 写道 看了半天也没能明白,配置抽取任务生成的xml文件到底是应该按照日期、小时方式命名,还是就是data.xml? 整个配置文件是通过data.xml来进行的,里面主要配置数据源,实现类(如果为了实现复杂数据抽取的时候,一般也可不定义),任务(定义抽取任务,如每隔多长时间在什么时候执行),程序就会自动按任务去执行数据抽取了 |
|
返回顶楼 | |
发表时间:2009-03-12
很好,和我的需求很像。想问一下楼主,怎么实现异构库之间的数据抽取,例如IBM DB2到Oracle之间的数据抽取。
|
|
返回顶楼 | |
发表时间:2009-03-12
脑袋雷劈的 写道 很好,和我的需求很像。想问一下楼主,怎么实现异构库之间的数据抽取,例如IBM DB2到Oracle之间的数据抽取。
OK的,只要select,insert语句的数据能对应起来就行,数据源可以来源于任何数据库或者文件,WebService |
|
返回顶楼 | |
发表时间:2009-03-15
请问楼主怎么测试呢?或者说怎么来部署它?
|
|
返回顶楼 | |
浏览 5730 次