2018-04-20  by 安静的下雪天  http://www.cnblogs.com/quiet-snowy-day/p/8890785.html 

本文翻译自SymmetricDS官方文档 Implement a New Database Dialect

Published: Monday, 25 February 2013 15:54

Written by Eric Long

  数据库方言是SymmetricDS中的软件层,包含特定于数据库平台的程序。SymmetricDS使用夸平台的通用架构实现数据复制。当一个任务需要数据库的特定细节时,便调用数据库方言来完成。方言处理的数据库特定任务的相关例子有,安装触发器,查询元数据,更改表结构。通过为方言接口编写实现,将对新数据库的支持将添加到SymmetricDS中。

Evaluating a New Database

  在实现新方言之前,需要评估数据库的功能,来确认将会支持SymmetricDS的哪些特性。

Data Capture ——数据捕获

  数据捕获系统需要数据库触发器。如果数据库不支持触发器,它不能作为数据源,但是它仍然可以作为目标来加载数据。触发器使用CSV格式记录数据变更,即需要函数来连结字符串,并使用转义字符来替换引号。

Transaction Identifier ——事务标识符

  当一行数据被捕获时,它所属的事务也同样会被记录。这样可以使SymmetricDS能够确保同一事务中的说有数据会被一起加载。这一特性需要来自数据库的事务标识符。

Conditional Sync ——条件同步

触发器所在表的sync_on_x_condition列,允许用户指定一个构建于触发器中的表达式。这一特性需要数据库支持允许“if”语句和条件的过程化语言。

Update Loop Prevention ——防止循环更新

有了记录变更的数据捕获系统,以及更新数据的数据加载系统,还需要防止循环更新的机制。这一特性需要一种方法来存储状态,使其限定于登录会话或者事务,例如会话变量或者私有临时表。

CLOB Sync

作为事务的组成部分捕获字符大对象(CLOB),数据库需要处理CLOB的函数来连结它们,并使用转义引号来替换引号。除此之外,还可以选择在进行批处理时,从数据库提取CLOB的数据流,从而替代在事务中捕获CLOB。

BLOB Sync

作为事务的组成部分捕获二进制大对象(BLOB),数据库需要处理BLOB的函数,使用已知格式(如base64或hex)将它们编码为varchar字符。除此之外,还可以选择在进行批处理时,从数据库提取BLOB的数据流,从而替代在事务中捕获BLOB。

Database Dialect Classes

在最高级别上,在symmetric-client项目中的数据库方言可以使用的,这是连结数据库平台的职责。在包路径org.jumpmind.symmetric.db下可以找到这些类。

Class

Interface

Responsibility

AbstractSymmetricDialect

ISymmetricDialect

Main database dialect class that handles calls and contains the trigger template and platform classes.

数据库方言主类,处理调用并包含触发器模板和平台类。

AbstractTriggerTemplate

 

Generate the data definition language statements that create database triggers on tables for data capture

生成DDL语句,为数据捕获在表上创建数据库触发器。

JdbcSymmetricDialectFactory

 

Bootstraps the dialect by detecting the platform and instantiating the correct AbstractSymmetricDialect

通过探测平台来引导方言,以便正确的实例化抽象类AbstractSymmetricDialect

  在低级别上,在symmetric-db项目中的数据库方言的职责在于生成DDL和DML语句。在包路径org.jumpmind.db.sql下可以找到这些类。

Class

Interface

Responsibility

AbstractDdlBuilder

IDdlBuilder

Generates statements to create and alter tables. It can process schema changes for a table and determine the alter statements needed.

生成语句,用于创建和更改表。它可以处理表结构上的变更,并确定必要的变更语句。

DmlStatement

 

Generates the statements to insert, update, and delete data in tables.

生成增加、修改、删除表数据的语句。

  在最低级别上,在symmetric-jdbc项目中的数据库方言的职责是,使用面向数据库的JDBC调用来满足服务调用。在包路径org.jumpmind.db.platform下可以找到这些类。

Class

Interface

Responsibility

AbstractJdbcDatabasePlatform

 

The platform class contains the SQL template, DDL reader, and DLL builder.

平台类,包含SQL模板、DDL读取器、以及DDL创建器。

AbstractJdbcDdlReader

IDdlReader

Reads metadata about tables and columns

读取表和列的元数据。

AbstractSqlTemplate

ISqlTemplate

Runs queries and updates on database

执行数据库上的查询和更改语句。

JdbcDatabasePlatformFactory

 

Bootstraps the platform by detecting the database and instantiating the correct AbstractJdbcDatabasePlatform

通过探测数据库来引导平台,以便正确地实例化抽象类AbstractJdbcDatabasePlatform

 

Database Dialect Implementation

一个典型的数据库方言将会扩展核心类,并在自己的包中提供实现。扩展类遵循命名约定,即使用数据库名称作为前缀。例如,以下这些类用于MySQL方言:

Project

Package

Implementation

symmetric-client

org.jumpmind.symmetric.db.mysql

MySqlSymmetricDialect

   

MySqlTriggerTemplate

symmetric-db

org.jumpmind.db.platform.mysql

MySqlDdlBuilder

   

MySqlDmlStatement

symmetric-jdbc

org.jumpmind.db.platform.mysql

MySqlDatabasePlatform

   

MySqlDdlReader

   

MySqlJdbcSqlTemplate

最后,为了引导新平台和方言,为了探测数据库、实例化平台以及方言实例,JdbcDatabasePlatformFactory和JdbcSymmetricDialectFactory类已被修改。

Testing

  新的方言实例化后,可以通过执行Junit测试用例来验证它是否可用。该测试只会运用方言支持的功能。例如,如果方言为isBlobSyncSupported()方法返回false,那么BLOB相关测试将会被跳过。

  集成测试被运用于两个复制引擎的实例之间。当客户端实例加载变更时,根实例会安装触发器并捕获变更。文件db-test.properties定义了哪些数据库将会被测试,以及如何连接。例如:如果想要测试MySQL作为根源,H2作为客户端,以下为该文件的段落:

test.root=mysql
test.client=h2 mysql.db.driver=com.mysql.jdbc.Driver
mysql.db.user=root
mysql.db.password=admin mysql.client.db.url=jdbc:mysql://localhost/SymmetricClient?tinyInt1isBit=false mysql.root.db.url=jdbc:mysql://localhost/SymmetricRoot?tinyInt1isBit=false h2.db.driver=org.h2.Driver
h2.db.user=sa
h2.db.password=
h2.client.db.url=jdbc:h2:file:target/clientdbs/client h2.root.db.url=jdbc:h2:file:target/rootdbs/root

  可以使用Maven的“test”目标来执行测试。属性可以在命令行指定,用于覆盖根源和客户端使用那些数据库。如果没有指定属性,则使用从db-test.properties文件读取属性设置。

mvn -Dtest.client=mysql -Dtest.root=h2 test

  如果你使用像Eclipse这样的集成开发环境,你可以运行单独的测试用例类。在Eclipse中,右键选择Run As->Junit Test。集成测试的运行配置如下所示:

Project:

symmetric-server

Test Class:

org.jumpmind.symmetric.test.SimpleIntegrationTest

Test Runner:

JUnit 4

谨慎使用JRE6来运行集成测试。现有测试版本的方法依赖于特定的运行顺序。如果使用JRE7,测试类的各方法会按随机顺序执行,这会导致错误。

【SymmetricDS】实现新的数据库方言的更多相关文章

  1. hibernate中数据库方言

    在配置hibernate.cfg.xml时需指定使用数据库的方言: 例: <property name="dialect">org.hibernate.dialect. ...

  2. Hibernate中的数据库方言(Dialect)

    在配置hibernate.cfg.xml时需指定使用数据库的方言: 例: <property name="dialect">org.hibernate.dialect. ...

  3. 重新安装了mysql,以前的数据库如何导入到新的数据库

    重新安装了mysql,以前的数据库如何导入到新的数据库,导入到新的数据库不能用真么办? 将之前的mysql中的data目录中的数据库文件夹,(需要哪个数据库复制哪个,不要都复制) D:/wamp/bi ...

  4. Spring3 整合Hibernate3.5 动态切换SessionFactory (切换数据库方言)

    一.缘由 上一篇文章Spring3.3 整合 Hibernate3.MyBatis3.2 配置多数据源/动态切换数据源 方法介绍到了怎么样在Sping.MyBatis.Hibernate整合的应用中动 ...

  5. Azure SQL 数据库与新的数据库吞吐量单位DTU

    azure中新的数据库吞吐量单位 (Database Throughput Unit, DTU) 是什么,以及用户如何通过它来了解新服务级别可以提供的服务内容.DTU 对于提供预测性更强的性能体验起着 ...

  6. Azure SQL 数据库与新的数据库吞吐量单位

    在这一期中,Scott 与 Azure SQL 数据库性能首席项目经理主管 Tobias Ternstrom 一起详细阐释了新的数据库吞吐量单位 (Database Throughput Unit, ...

  7. hibernate数据库方言

    hibernate数据库方言 mark一下 RDBMS 方言 DB2 org.hibernate.dialect.DB2Dialect DB2 AS/400 org.hibernate.dialect ...

  8. Hibernate不同数据库 方言|驱动|url 配置

    Hibernate不同数据库方言|驱动|url mySql: hibernate.dialect : org.hibernate.dialect.MySQLDialect driverClassNam ...

  9. 【MS SQL】把多个数据库合并为一个新的数据库

    原文:[MS SQL]把多个数据库合并为一个新的数据库 因应工作要求,需要把两个数据库合并成一个库: 一开始使用"导入数据.导出数据和复制数据库"三个工具时,没有达到要的效果. 后 ...

随机推荐

  1. Hadoop的Docker镜像构建

    1.Dockerfile ###Dockerfile -- beagin FROM ubuntu:trusty #MAINTAINER The Hue Team "https://githu ...

  2. 基于“基于dockerhub的jetty镜像的ossfs镜像”部署war包,遇到的文件夹读写权限被限制的问题解决方案

    前提: “基于dockerhub的jetty镜像的ossfs镜像” 已经搭建好了. 部署准备: 1.本地打包:war包-->idea工具 mvn 打包. 2.本地sh脚本:compile_vps ...

  3. EntityFramework 学习 一 Validate Entity

    可以为实体实现自定义验证,重写DBContext中的个ValidateEntity方法 protected override System.Data.Entity.Validation.DbEntit ...

  4. HBase学习3(win下使用Eclipse搭建hbase开发环境)

    第一步:创建一个java project命名为wujiadong_hbase 第二步:在该工程下创建一个folder命名为lib(储存依赖的jar包) 第三步:将集群中的hbase安装目录下载一份到w ...

  5. JAVA Properties配置文件的读写

    通常我们就会看到一个配置文件,比如:jdbc.properties,它是以“.properties”格式结尾的.在java中,这种文件的内容以键值对<key,value>存储,通常以“=” ...

  6. Ceilometer 数据库比较

    Ceilometer和其他OpenStack项目相比,部署中比较不同的是Ceilometer可以选用多种不同的后台数据库来保存测量值和警告器. 目前Ceilometer支持的后台数据库及及其相应的配置 ...

  7. css3——transition属性和opacity属性

    [transition-duration] 是一个css3属性,规定完成过度效果需要花费的时间(一秒或毫秒计).语法:transition-duration: time;time :    规定完成过 ...

  8. Container容器调用构造函数

  9. Django-form补充

    Django_form补充 问题1:  注册页面输入为空,报错:keyError:找不到password def clean(self): print("---",self.cle ...

  10. 分布式事务_01_2PC框架raincat快速体验

    一.前言 关于2PC的理论知识请见:分布式_理论_03_2PC 这一节我们来看下github上一个优秀的2PC分布式事务开源框架的快速体验. 二.源码 源码请见: https://github.com ...