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