之前尝试了基于物化视图+java source的oracle数据同步方案,为了把物化视图的变化信息传递给java source发送给外部程序,需要使用触发器、存储过程/函数。触发器用于监控物化视图的数据变化,调用存储过程从而间接调用java source(存储过程可以指向一个java source)。该方案的缺点如下:
1、给每个同步表建立物化视图,会消耗存储资源
2、java source部分代码可能需要依赖第三方包,需要在数据库服务器上加载大量外部jar包
3、每个物化视图上都需要建立触发器,监控数据变化(看了yugong后,在想是否直接在物化视图日志上建立触发器,但相对就会繁琐,需要根据日志表记录从主表拿数据,然后传递给java source,最后删除日志)
最近看了阿里基于oracle的数据库迁移项目yugong,其也是基于物化视图进行的实现。差异在于:
1、虽然都是基于物化视图,但yugong项目仅使用物化视图日志,且创建物化视图日志时使用了参数PRIMARY KEY、SEQUENCE,这样日志中将包含主键列、操作序号。extractor会按照SEQUENCE$$顺序抽取变化数据,并把已抽取的变化数据从日志表中删除。而原来的方案使用的物化视图的快速刷新,commit后自动刷新到物化视图,日志被清空
2、yugong中数据抽取使用的是jdbc,即extractor部分(从源库抽取数据),根据日志表中的主键列从源表获取数据;而原方案使用触发器获取数据变化。
3、yugong的applier部分(更新到目标库),同样使用jdbc,直接把转化后的数据更新入目标库;而原方案利用java source把变化数据发送给外部程序处理。
4、yugong引入了Translator,用于异构数据转化;而原方案使用外部的consumer处理
yugong详细介绍,可以参考:
https://github.com/alibaba/yugong/wiki/AdminGuide
http://blog.csdn.net/sunnylinner/article/details/52064637
物化视图详细介绍,可以参考:
http://www.cnblogs.com/linjiqin/archive/2012/05/23/2514795.html
下面主要介绍下使用时遇到的问题:
1、SEQUENCE$$标识符无效,原因在于查询增量记录时以SEQUENCE$$进行排序,获取顺序操作记录。用于测试的表之前创建过物化视图日志,但是创建时未使用SEQUENCE
2、yugong.extractor.noupdate.thresold,需要注意该值的设置,小于等于0将一直处于增量状态。若大于0,处于追赶状态,执行增量次数超过该值将结束增量,释放资源给下一个表。需要与yugong.table.concurrent.size配合使用。比如:thresold=0、concurrent.size=1,同步两张表,只有一张表处于同步状态,另一张表处于等待状态。因为只有一个处理线程,而thresold=0线程一直得不到释放。同样,thresold=3、concurrent.size=5,还是同步两张表,同步线程不会因为并发线程数多而不释放。因此,如果需要持续同步大量表,就需要设置thresold=0、concurrent.size=n,n大于等于同步表数。n可能很大,也可以想办法让同步过的表再次加入同步队列。
3、大量表持续同步时开启并行模式,抽取、入目标库都使用多线程,因此应该独立部署。但前提与两个数据库都可直连
4、yugong每个表对应一个instance,负责表的迁移,包含extractor、translator、applier。extractor与translator、applier无法分离,独立部署,不适用目标库无法直连的情况
Clob字段类型无法正常同步的问题:Clob类型字段在数据抽取时被转换为String类型的值,但ColumnMeta.type没有改变,值与类型不匹配。在数据更新或插入目标库中时,ps.setObject(index,cv.getValue(),cv.getColumn().getType()),String类型无法转换为Clob类型,sql执行失败。解决方案:重新设置字段类型,与值保持一致,
col.setType(Types.VARCHAR);
public abstract class AbstractOracleRecordExtractor extends AbstractRecordExtractor {
protected ColumnValue getColumnValue(ResultSet rs, String encoding, ColumnMeta col) throws SQLException {
if(){
...
}else if (YuGongUtils.isClobType(col.getType())) {
value = rs.getString(col.getName());
col.setType(Types.VARCHAR);
}
...
}
}
Blob字段类型同样无法正常同步:和Clob同样的问题,获取数据时被转换为byte[],ps.setObject时值与类型不一致。
注意事项:最初考虑取值时不转换,直接取Blob,这样值与类型就一致了,但同样失败:表或视图不存在。原因在于Blob使用LOCATOR(定位器)实现,指向数据库中SQL BLOB,不能把A库中的BLOB作为值直接作用于B库中的BLOB。BLOB可参考:
http://blog.csdn.net/terryzero/article/details/3939014
解决方案:在Applier中调用ps.setObject(index,cv.getValue(),cv.getColumn().getType())时,进行数据类型判断,当类型为Types.BLOB时,执行ps.setBinaryStream(index, new ByteArrayInputStream((byte[])cv.getValue()));
if(cv.getColumn().getType()==Types.BLOB){
ps.setBinaryStream(index, new ByteArrayInputStream((byte[])cv.getValue()));
}else{
ps.setObject(index, cv.getValue(), cv.getColumn().getType());
}
同样CLOB也可以用同样的解决方案:取值时仍然转换为String类型,占位符赋值时处理
if(cv.getColumn().getType()==Types.CLOB){
ps.setCharacterStream(index, new StringReader((String)cv.getValue()));
}else{
ps.setObject(index, cv.getValue(), cv.getColumn().getType());
}
java.lang.AbstractMethodError:oracle.jdbc.driver.T4CPreparedStatement.setBlob(ILjava/io/InputStream:Oracle驱动版本的问题,数据库驱动改ojdbc6.jar 即可
全局schema问题:
1、源库:不指定表时,默认取当前连接schema下的所有表;指定表时,若不指定schema,有可能取到多个schema(一个表存在多个schema中),这种情况需要指定schema。源码详见:TableMetaGenerator.getTableMetasWithoutColumn
2、目标库:默认使用源库的schema,当源库和目标库不一致时,需要增加全局schema转换器,实现如下:
- 增加配置项:yugong.applier.table.schema
- 增加全局schema转换类:SchemaDataTranslator,代码如下:
public class SchemaDataTranslator extends AbstractDataTranslator implements DataTranslator {
private String tableSchema;
public SchemaDataTranslator(String tableSchema){
this.tableSchema=tableSchema;
}
public String translatorSchema() {
return tableSchema;
}
public List<Record> translator(List<Record> records) {
for (Record record : records) {
String schema = translatorSchema();
if (schema != null) {
record.setSchemaName(schema);
}
}
return records;
}
}
- 初始化instance时引入Translator:yugong.applier.table.schema,修改YuGongController.buildTranslator代码如下:
private DataTranslator buildTranslator(String name) throws Exception {
String tableName = YuGongUtils.toPascalCase(name);
String translatorName = tableName + "DataTranslator";
String packageName = DataTranslator.class.getPackage().getName();
Class clazz = null;
try {
clazz = Class.forName(packageName + "." + translatorName);
} catch (ClassNotFoundException e) {
File file = new File(translatorDir, translatorName + ".java");
if (!file.exists()) {
// 兼容下表名
file = new File(translatorDir, tableName + ".java");
if (!file.exists()) {
String targetSchema=config.getString("yugong.applier.table.schema", null);
if(StringUtils.isNotBlank(targetSchema)){
return new SchemaDataTranslator(targetSchema);
}
return null;
}
}
String javaSource = StringUtils.join(IOUtils.readLines(new FileInputStream(file)), "\n");
clazz = compiler.compile(javaSource);
}
return (DataTranslator) clazz.newInstance();
}
分享到:
相关推荐
这个压缩包“【气象水文数据】禹贡地理数据.zip”很可能包含了与这一主题相关的大量数据,用于分析和研究我国古代的气候条件、水文变化以及与之相关的社会经济活动。 气象数据通常包括温度、湿度、风速、降水量、...
禹贡扩展了对BIM数据、遥感影像和二维矢量数据的支持,同时也引入了空间网格编码,极大地丰富了GIS处理不同类型数据的能力。这一创新使得禹贡能够支持二三维一体化,满足现代GIS应用对数据多样性的需求。 禹贡的一...
这篇由刘昕、罗禹贡、付晓丹、罗国鹏和赵建筑共同撰写的报告详细分析了这两个方面,旨在为电动汽车参数设定和充电设施建设提供参考数据。研究通过调查527份有效问卷,收集了关于汽车日均行驶里程、空调使用等因素的...
4. **禹贡学会与《禹贡》半月刊**:在30年代,禹贡学会及其期刊《禹贡》推动了历史地理学的发展,体现了从沿革地理向现代历史地理学的转化愿望。 5. **新中国成立后的进展**:50年代至60年代,历史地理学逐渐取代...
本文以文献记载为线索,通过野外实地调查,从地质构造、地层分布和古地理环境诸方面,对荥阳地区槽状洼地内的湖相地层进行了较为系统的研究,并根据该地层的14C测年数据,认为这一湖相地层是由《禹贡》济水“入于河...
4. RS(遥感)提供数据源,GPS(全球定位系统)用于导航和定位,GIS(地理信息系统)整合了地理学、测量学、地图学和遥感,用于数据处理和分析。 5. 地图投影的主要矛盾在于保持几何形状和面积的关系不变,同时保持...
文章回顾了土地用途分区的历史沿革,从古籍《禹贡》中可见古代中国对土地适宜性的认识与利用,体现了因地制宜的思想,为后世土地用途分区和管制理念奠定了基础。同时,文章总结了国内外关于土地用途分区的理论研究与...
本文通过对相关文献的引用,如禹贡的《旅游景区景点营销》和刘锋的《旅游景区营销》,为读者提供了深入的分析。 首先,文章可能会探讨旅游景区营销面临的主要问题。这些问题可能包括过度依赖传统营销手段,如广告和...
古代地理学思想被划分为早期、中期和晚期,报告详细列举了各个时期的重要贡献,例如古希腊的先驱如德谟克里特、柏拉图、亚里士多德以及中国的《禹贡》、《三经》等经典著作。 在古代中期,地理学的中心分别在中国、...
从《史记》和《尚书·禹贡》中的记载可以看出,古代九州的划分与当时的人口分布和经济发展密切相关。扬州、荆州等地区在古代就已是重要的经济区。随着时间的推移,尤其是人口的迁移,江南地区的经济地位日益凸显。 ...
2. **文言文与古代文学**:《山经》和《禹贡》的提及,展示了中国古代地理著作的内容和特点,如《禹贡》对九州的划分,体现了古代的自然区划思想。同时,涉及到的文人如文天祥、鲁迅、杨绛等,以及他们的作品,是...
现有的研究往往停留在理论层面,如杨振之在《旅游项目策划》中提出的四种目标客源市场定位类型,以及禹贡和胡丽芳在《旅游景区景点营销》中提到的选择目标市场的三个考虑因素,这些理论并未提供详尽的实践步骤。...
自然区划自古就有,如《禹贡》和《汉书·地理志》中对地理、风俗、民生等方面的划分。随着地理学和生态学的进步,区划工作逐渐深入。19世纪初,德国地理学家洪堡通过等温线图揭示了气候与地形、地理位置的关系,俄国...
1. **中国古代地理学贡献**:古代中国的地理学家在地形测量、地图绘制等方面做出了许多重要的贡献,例如《禹贡》中对中国的地理划分,《徐霞客游记》中的旅行考察记录等。 2. **地理大发现的影响**:15世纪末至16...
- 年鉴是一种逐年编纂的资料性出版物,通常包含统计数据、大事记等内容。 - 类书是综合各种资料,按一定分类编排的知识集成。 - 名录则是列举特定领域或主题的文献目录。 4. 古代文献整理与索引编制: - 明清...
饶宗颐的研究方法深受清朝朴学影响,同时也受到了家学、古史辨派、禹贡学派以及齐鲁大学学者的启发。在其学术生涯中,饶宗颐的《殷困民国考》成为他早期甲骨学研究的代表作,这部作品是在抗战胜利后的广东省立文理...
《禹贡》学会是由顾颉刚和谭其骧于1934年发起创建的,是中国历史地理学的重要里程碑。学会通过创办《禹贡》半月刊,推动了历史地理学在中国的研究与发展,为该学科在中国的根基打下了坚实的基础。 在历史地理学的...
这一壮举在古代文献中多有记载,如《禹贡》和《魏土地记》等,都描述了大禹在龙门山的工程。此外,全国各地都有纪念大禹的遗迹,如禹门口、禹功矶等,这些都反映了人们对大禹的敬仰和怀念。 对于大禹其人,历史上...
4. 中央集权制度的认同:战国晚期的著作如《周礼》、《禹贡》和《职方》提出理想化的中央集权制度和统一的地理学说,这表明当时社会对中央集权的认可度逐渐增强。 5. 法治取代礼治:商鞅变法中推行公正无私的法治,...