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


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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM