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. HDFS-查看文件属性+文件名称过滤

    package com.zhen.hdfs; import java.io.IOException; import java.io.OutputStream; import java.net.URI; ...

  2. 在java中public void与public static void区别

    static 方法可以被main方法直接调用,而非static方法不可以.因为static方法是属于类的,是类方法.可以通过类名.方法名直接调用.而非static方法必须等对象被new出来以后才能使用 ...

  3. openstack havana块存储Cinder磁盘加密方法研究

    http://blog.csdn.net/cloudresearch/article/details/19092219 在openstack havana的release note中有如下介绍“Att ...

  4. R树的相关知识

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

  5. Splash设置

    平常这个东西是自动充满屏幕的,今天一下子居中只显示1/4了.原来不小心改动了这里 splash scaling属性,改回这个就没问题了

  6. sorket is closed

    今早来公司启动项目时,发现在代码正确的情况下报了一个错. 15:19:14.362 [http-9000-2] ERROR com.nari.osp.servicebus.rmi.LongConnec ...

  7. Node的异步I/O

    node是单线程非阻塞异步I/O的模式. 阻塞I/O:完成整个数据获取的过程: 非阻塞I/O:不带数据,直接立即返回,要获取数据,还需通过文件描述符再次读取. node完成整个异步I/O的有事件循环. ...

  8. Mysql 高级部分

    MySQL 高级部分   (1)索引(index)..................................................................... 1 (2) ...

  9. angularjs 简单指令

    <!DOCTYPE html> <html data-ng-app="app"> <head> <title>angular js& ...

  10. deep learning (六)logistic(逻辑斯蒂)回归中L2范数的应用

    zaish上一节讲了线性回归中L2范数的应用,这里继续logistic回归L2范数的应用. 先说一下问题:有一堆二维数据点,这些点的标记有的是1,有的是0.我们的任务就是制作一个分界面区分出来这些点. ...