【SymmetricDS】實現新的數據庫方言

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

 

本文翻譯自SymmetricDS官方文檔 Implement a New Database Dialectmysql

 Published: Monday, 25 February 2013 15:54sql

 Written by Eric Long數據庫

 

  數據庫方言是SymmetricDS中的軟件層,包含特定於數據庫平臺的程序。SymmetricDS使用誇平臺的通用架構實現數據複製。當一個任務須要數據庫的特定細節時,便調用數據庫方言來完成。方言處理的數據庫特定任務的相關例子有,安裝觸發器,查詢元數據,更改表結構。經過爲方言接口編寫實現,將對新數據庫的支持將添加到SymmetricDS中。架構

 

Evaluating a New Database

  在實現新方言以前,須要評估數據庫的功能,來確認將會支持SymmetricDS的哪些特性。函數

 

Data Capture ——數據捕獲

  數據捕獲系統須要數據庫觸發器。若是數據庫不支持觸發器,它不能做爲數據源,可是它仍然能夠做爲目標來加載數據。觸發器使用CSV格式記錄數據變動,即須要函數來連結字符串,並使用轉義字符來替換引號。oop

 

Transaction Identifier ——事務標識符

  當一行數據被捕獲時,它所屬的事務也一樣會被記錄。這樣可使SymmetricDS可以確保同一事務中的說有數據會被一塊兒加載。這一特性須要來自數據庫的事務標識符。測試

 

Conditional Sync ——條件同步

      觸發器所在表的sync_on_x_condition列,容許用戶指定一個構建於觸發器中的表達式。這一特性須要數據庫支持容許「if」語句和條件的過程化語言。ui

 

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,測試類的各方法會按隨機順序執行,這會致使錯誤。

相關文章
相關標籤/搜索