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. NLP-特征选择

    文本分类之特征选择 1 研究背景 对于高纬度的分类问题,我们在分类之前一般会进行特征降维,特征降维的技术一般会有特征提取和特征选择.而对于文本分类问题,我们一般使用特征选择方法. 特征提取:PCA.线 ...

  2. ajax02-XMLHttpRequest 对象的使用

    XMLHttpRequest 是 AJAX 的基础,用于在后台与服务器交换数据.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新. XMLHttpRequest 对象 所有现代浏览器均 ...

  3. R树的相关知识

    转自:http://blog.csdn.net/houzuoxin/article/details/16113895 R树在数据库等领域做出的功绩是非常显著的.它很好的解决了在高维空间搜索等问题.举个 ...

  4. javascript删除JSON元素

    首先要搞清JSON的数据格式,我这里所说的JSON都是指javascript中的. JSON数据是由对象和数组数据结构组成,我们只要学会javascript中对对象和数组的删除方法即可对JSON项进行 ...

  5. 使用struts碰到的错误

    这种错误更有可能url中路径写错了. 而这种情况更有可能使struts.xml写错了.特别要注意action的属性值class的编写是否正确.

  6. review09

    String类在java.lang包中,由于java.lang包中的类被默认引入,所以可以直接使用String类.String对象的创建可以直接使用带字符串参数的构造方法 String s = new ...

  7. QT5 QtreeWidget 实现点击item事件以及右键菜单删除item 和 重命名item

    1.new 一个QTreeWidget 对象,并设置头标签,和根节点(个人程序需要) QTreeWidget* treeWidget = ui.treeWidget;//我已经在ui设计师中拖了一个Q ...

  8. IntelliJ IDEA配置tomcat【全程详解】

    相关博客:IntelliJ IDEA创建Maven+SSM+Tomcat+Git项目[全程详解] 创建好web项目后,需要将项目部署到Tomcat中运行. 接下来,图文解析IntelliJ IDEA如 ...

  9. LeetCode OJ:Lowest Common Ancestor of a Binary Search Tree(最浅的公共祖先)

    Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BS ...

  10. 剑指offer--22.反转链表

    时间限制:1秒 空间限制:32768K 热度指数:440624 本题知识点: 链表 题目描述 输入一个链表,反转链表后,输出新链表的表头. /* struct ListNode { int val; ...