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中。架構
在實現新方言以前,須要評估數據庫的功能,來確認將會支持SymmetricDS的哪些特性。函數
數據捕獲系統須要數據庫觸發器。若是數據庫不支持觸發器,它不能做爲數據源,可是它仍然能夠做爲目標來加載數據。觸發器使用CSV格式記錄數據變動,即須要函數來連結字符串,並使用轉義字符來替換引號。oop
當一行數據被捕獲時,它所屬的事務也一樣會被記錄。這樣可使SymmetricDS可以確保同一事務中的說有數據會被一塊兒加載。這一特性須要來自數據庫的事務標識符。測試
觸發器所在表的sync_on_x_condition列,容許用戶指定一個構建於觸發器中的表達式。這一特性須要數據庫支持容許「if」語句和條件的過程化語言。ui
有了記錄變動的數據捕獲系統,以及更新數據的數據加載系統,還須要防止循環更新的機制。這一特性須要一種方法來存儲狀態,使其限定於登陸會話或者事務,例如會話變量或者私有臨時表。編碼
做爲事務的組成部分捕獲字符大對象(CLOB),數據庫須要處理CLOB的函數來連結它們,並使用轉義引號來替換引號。除此以外,還能夠選擇在進行批處理時,從數據庫提取CLOB的數據流,從而替代在事務中捕獲CLOB。
做爲事務的組成部分捕獲二進制大對象(BLOB),數據庫須要處理BLOB的函數,使用已知格式(如base64或hex)將它們編碼爲varchar字符。除此以外,還能夠選擇在進行批處理時,從數據庫提取BLOB的數據流,從而替代在事務中捕獲BLOB。
在最高級別上,在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 |
一個典型的數據庫方言將會擴展核心類,並在本身的包中提供實現。擴展類遵循命名約定,即便用數據庫名稱做爲前綴。例如,如下這些類用於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類已被修改。
新的方言實例化後,能夠經過執行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,測試類的各方法會按隨機順序執行,這會致使錯誤。