【SymmetricDS】实现新的数据库方言

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,测试类的各方法会按随机顺序执行,这会导致错误。

原文地址:https://www.cnblogs.com/quiet-snowy-day/p/8893066.html

时间: 2024-10-17 20:34:52

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

Hibernate中的数据库方言(Dialect)

在配置hibernate.cfg.xml时需指定使用数据库的方言: 例: <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property> 以下是各数据库对应的方言(Dialect): 数据库 方言(Dialect) DB2 org.hibernate.dialect.DB2Dialect DB2 AS/400 org.hibernate.dialect.DB2400Dialect D

5 -- Hibernate的基本用法 --4 4 数据库方言

Hibernate底层依然使用SQL语句来执行数据库操作,虽然所有关系数据库都支持使用标准SQL语句,但所有数据库都对标准SQL进行了一些扩展,所以在语法细节上存在一些差异.因此,Hibernate需要根据数据库来识别这些差异. 同样的应用程序,如果在不同的数据库之间迁移,底层数据库的访问细节会发生改变,开发者需要做的是,告诉Hibernate应用程序的底层即将使用哪种数据库  ------  这就是数据库方言. Properties : MySQL org.hibernate.dialect.

Mybatis分页-利用Mybatis Generator插件生成基于数据库方言的分页语句,统计记录总数 (转)

众所周知,Mybatis本身没有提供基于数据库方言的分页功能,而是基于JDBC的游标分页,很容易出现性能问题.网上有很多分页的解决方案,不外乎是基于Mybatis本机的插件机制,通过拦截Sql做分页.但是在像Oracle这样的数据库上,拦截器生成的Sql语句没有变量绑定,而且每次语句的都要去拦截,感觉有点浪费性能. Mybatis Generator是Mybatis的代码生成工具,可以生成大部分的查询语句. 本文提供的分页解决方案是新增Mybatis Generator插件,在用Mybatis

各种数据库方言

在配置hibernate.cfg.xml时需指定使用数据库的方言: 例: <property name="dialect">org.hibernate.dialect.MySQL5Dialect<!--property> 以下是各数据库对应的方言(Dialect): 数据库 方言(Dialect) DB2 org.hibernate.dialect.DB2Dialect DB2 AS/400 org.hibernate.dialect.DB2400Dialect

XenDesktop 5.6 数据库恢复测试,切换新的数据库

有时在POC项目中,经常想更换全新的数据库,或数据库迁移恢复数据库,可以参考以下方法进行恢复数据库 1.当数据库服务器需要做灾难恢复时,首先确保XenDesktop数据库有备份,数据库TSCTXVC001 2.还原新的数据库服务器,TSCTXDB101 3.打开新的数据库服务器,确保DDC服务器都在新数据库服务器上有自己的登录名,没有需要用命令创建 4.确保DDC本机登录名,有Citrix相关服务角色,并且赋予权限 5.在DDC服务器使用管理员运行PowerShell,清空当前DDC与数据库连接

新炬数据库大师—暑期公益体验课

新炬数据库大师—暑期公益体验课 一.有志于从事DBA的(学生)不容错过 1. 中国最大最专业的ORACLE软件服务商:本次活动主办方上海新炬网络技术有限公司(以下简称上海新炬),是中国最大最专业的ORACLE软件服务商,负责着中国移动40%的数据库在系统服务,专注于为企业提供专业的IT运维服务.IT外包服务.云计算.大数据解决方案和自动化测试平台等. 2. 强大的专家团队与业内顶尖平台的结合:上海新炬拥有300多名行业架构师和IT技术专家作为讲师后盾,联合业内顶级Oracle 公司高级DBA一同

mysql5.7基础 创建一个新的数据库

镇场文:       学儒家经世致用,行佛家普度众生,修道家全生保真,悟易理象数通变.以科技光耀善法,成就一良心博客.______________________________________________________________________________________________________ Operating System:UbuntuKylin 16.04 LTS 64bitmysql: Ver 14.14 Distrib 5.7.17, for Linux (

hibernate中数据库方言

在配置hibernate.cfg.xml时需指定使用数据库的方言: 例: <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property> 以下是各数据库对应的方言(Dialect): 数据库 方言(Dialect) DB2 org.hibernate.dialect.DB2Dialect DB2 AS/400 org.hibernate.dialect.DB2400Dialect D

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

重新安装了mysql,以前的数据库如何导入到新的数据库,导入到新的数据库不能用真么办? 将之前的mysql中的data目录中的数据库文件夹,(需要哪个数据库复制哪个,不要都复制) D:/wamp/bin/mysql/mysql5.0.5b/data中的移动到D:/lamp/mysql/data/data中,数据可用 2. 如果数据库不能用,就先关闭数据库服务器 然后把原来的J:\xampp2\mysql\data\ibdata1覆盖到D:\xampp\mysql\data 再开启mysql服务器