From e8cc1336c93ccc9f154f8b3221c4da0cee6325d8 Mon Sep 17 00:00:00 2001 From: inrgihc Date: Fri, 28 Jul 2023 21:33:37 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=87=E6=A1=A3=E7=9B=B8=E5=85=B3=E8=A1=A5?= =?UTF-8?q?=E5=85=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ADD_PRODUCT_DOC.md | 163 ++++++++++++++++++ README.md | 14 +- .../query/DefaultTableDataQueryProvider.java | 2 +- .../dbswitch/product/hive/HiveFeatures.java | 6 +- .../openguass/OpenGaussFactoryProvider.java | 1 + pom.xml | 8 + 6 files changed, 184 insertions(+), 10 deletions(-) create mode 100644 ADD_PRODUCT_DOC.md diff --git a/ADD_PRODUCT_DOC.md b/ADD_PRODUCT_DOC.md new file mode 100644 index 00000000..7d4e58d6 --- /dev/null +++ b/ADD_PRODUCT_DOC.md @@ -0,0 +1,163 @@ +# 接入新的自定义关系型数据库的开发说明文档 + +### 1、背景说明 + +虽然dbswitch已经集成支持了MySQL、Oracle、SQLServer、PostgreSQL、DB2、SBase、MariaDB、SQLite、Hive及 +DM、Kingbase、OSCar、GBase等部分国产数据库。但近些年关系型数据库不断涌现,不过基本上都是类似或兼容MySQL、Oracle、 +PostgreSQL等数据库的,只是存在某些特殊的语法情况而已。为此,为方便适配这些新的数据库接入到dbswitch中来,编写此说明 文档,方便开发者快速的开发新的适配数据库的模块。 + +### 2、开发步骤说明 + +> 这里以新增openguass为例: + +**(1) dbswitch-product下新建子模块:** + +在模块dbswitch-product下新建子模块,例如:dbswitch-product-openguass,并在pom.xml中配置如下依赖: + +``` + + com.gitee.dbswitch + dbswitch-common + ${project.version} + + + + com.gitee.dbswitch + dbswitch-core + ${project.version} + +``` + +**(2) 添加新的数据库产品类型枚举值:** + +在dbswitch-common模块里,找到com.gitee.dbswitch.common.type.ProductTypeEnum的定义,并在最后追加以数据库产品 命名的枚举字符串,例如: + +``` + /** + * OpenGauss数据库类型 + */ + OPENGAUSS(14, "\"", "opengauss", "org.opengauss.Driver", 15432, + "SELECT 1", + "jdbc:opengauss://", + new String[]{"jdbc:opengauss://{host}[:{port}]/[{database}][\\?{params}]"}), +``` + +枚举值的附带信息对应如下: + +- 编号: 14 +- 限定符: " (单双引号) +- 产品名字符串: opengauss +- 驱动类名: org.opengauss.Driver +- 默认端口号: 15432 +- 测试连接使用的SQL: SELECT 1 +- JDBC连接串的前缀: jdbc:opengauss:// +- JDBC连接串的模板: jdbc:opengauss://{host}[:{port}]/[{database}][\\?{params}] + +**(3) 编写对接实现模块dbswitch-product-openguass的java代码:** + +``` +[root@localhost dbswitch-product-opengauss]# tree . +. +├── pom.xml +└── src + └── main + ├── java + │   └── com + │   └── gitee + │   └── dbswitch + │   └── product + │   └── openguass + │   ├── OpenGaussFactoryProvider.java + │   ├── OpenGaussFeatures.java + │   ├── OpenGaussMetadataQueryProvider.java + │   └── OpenGaussTableOperateProvider.java + └── resources + └── META-INF + └── services + └── dbswitch.providers +``` + +其中OpenGaussFactoryProvider.java必须继承自com.gitee.dbswitch.provider.AbstractFactoryProvider,并带有@Product注解: + +``` +@Product(ProductTypeEnum.OPENGAUSS) +public class OpenGaussFactoryProvider extends AbstractFactoryProvider { + + // 构造函数必须以DataSource作为参数类型,并传递给父类 + public OpenGaussFactoryProvider(DataSource dataSource) { + super(dataSource); + } + + // 这里提供数据库特征配置实现对象(可参见OpenGaussFeatures的定义,目前基本上为空类) + @Override + public ProductFeatures getProductFeatures() { + return new OpenGaussFeatures(); + } + + // 这里提供数据库元数据查询的实现对象,继承自com.gitee.dbswitch.provider.meta.AbstractMetadataProvider + // 这里需编写类OpenGaussMetadataQueryProvider查询元数据信息的实现代码 + @Override + public MetadataProvider createMetadataQueryProvider() { + return new OpenGaussMetadataQueryProvider(this); + } + + // 这里提供对数据库表的drop和truncate操作的实现对象,继承自com.gitee.dbswitch.provider.operate.DefaultTableOperateProvider + @Override + public TableOperateProvider createTableOperateProvider() { + return new OpenGaussTableOperateProvider(this); + } + + // 这里提供对数据库表的批量插入数据操作的实现对象,继承自com.gitee.dbswitch.provider.write.DefaultTableDataWriteProvider + // 也可配置为 new AutoCastTableDataWriteProvider(this); + @Override + public TableDataWriteProvider createTableDataWriteProvider(boolean useInsert) { + return new AutoCastTableDataWriteProvider(this); + } + + // 这里提供对数据库表数据的Insert、Update、Delete同步操作的实现对象,继承自com.gitee.dbswitch.provider.sync.DefaultTableDataSynchronizer + // 也可配置为 new AutoCastTableDataSynchronizer(this); + @Override + public TableDataSynchronizer createTableDataSynchronizer() { + return new AutoCastTableDataSynchronizer(this); + } +} + +``` + +**(4) 添加dbswitch.providers实现类配置:** + 在文件resources/META-INF/services/dbswitch.providers(需要创建)中,添加上述实现类的全类名: + +``` +[root@localhost dbswitch-product-opengauss]# cat src/main/resources/META-INF/services/dbswitch.providers +com.gitee.dbswitch.product.openguass.OpenGaussFactoryProvider +``` + +**(5) 为dbswitch-register-product增加依赖:** + +在dbswitch-product/dbswitch-register-product/pom.xml中增加依赖: + +``` + + + com.gitee.dbswitch + dbswitch-product-openguass + ${project.version} + +``` + +**(6) 根目录下的drivers下添加驱动jar文件 + +在根目录下的drivers/opengauss/opengauss-3.0.0/下增加对应的版本的驱动jar文件。 + + + + +完成上述的开发内容后,即可使用根目录下的build.sh(linux/MacOS下)或build.cmd(windows下)进行打包后部署了。如果成功会在日志中 +有如下内容的输出,包含有新添加的OPENGAUSS注册的信息: +``` +2023-01-28 21:35:13.768 [main] INFO c.g.d.p.r.ProductRegisterAutoConfiguration - Register database product now ... +... +2023-01-28 21:35:13.787 [main] INFO com.gitee.dbswitch.provider.ProductProviderFactory - Register product OPENGAUSS by subclass :com.gitee.dbswitch.product.openguass.OpenGaussFactoryProvider +.... +2023-01-28 21:35:13.805 [main] INFO c.g.d.p.r.ProductRegisterAutoConfiguration - Finish to register total 14 database product ! +``` diff --git a/README.md b/README.md index c8f4e38a..799b60e2 100644 --- a/README.md +++ b/README.md @@ -534,15 +534,21 @@ bin/startup.sh > 多个任务并发执行不易于分析任务错误原因; -## 四、模块集成开发说明 +## 四、模块开发说明 -### 1、dbswitch安装到本地仓库 +### 1、集成支持新的关系型数据库产品 + +参考教程: [接入自定义关系型数据库的开发说明文档](ADD_PRODUCT_DOC.md) + +### 2、集成dbswitch模块进行二次开发 + +#### (1)、dbswitch安装到本地仓库 ``` cd dbswitch && mvn clean install ``` -### 2、pom.xml中引入dbswitch模块依赖 +#### (2)、pom.xml中引入dbswitch模块依赖 ``` @@ -552,7 +558,7 @@ cd dbswitch && mvn clean install ``` -### 3、代码集成开发 +#### (3)、代码集成开发 ``` // 构建任务执行的线程池 diff --git a/dbswitch-core/src/main/java/com/gitee/dbswitch/provider/query/DefaultTableDataQueryProvider.java b/dbswitch-core/src/main/java/com/gitee/dbswitch/provider/query/DefaultTableDataQueryProvider.java index b84ca454..98b76ad3 100644 --- a/dbswitch-core/src/main/java/com/gitee/dbswitch/provider/query/DefaultTableDataQueryProvider.java +++ b/dbswitch-core/src/main/java/com/gitee/dbswitch/provider/query/DefaultTableDataQueryProvider.java @@ -51,7 +51,7 @@ public class DefaultTableDataQueryProvider public void setQueryFetchSize(int size) { if (size < Constants.MINIMUM_FETCH_SIZE) { throw new IllegalArgumentException( - "设置的批量处理行数的大小fetchSize不得小于" + Constants.MINIMUM_FETCH_SIZE); + "设置的批量处理行数的大小fetchSize=" + size + "不得小于" + Constants.MINIMUM_FETCH_SIZE); } this.fetchSize = size; } diff --git a/dbswitch-product/dbswitch-product-hive/src/main/java/com/gitee/dbswitch/product/hive/HiveFeatures.java b/dbswitch-product/dbswitch-product-hive/src/main/java/com/gitee/dbswitch/product/hive/HiveFeatures.java index c1b7dee5..6df33334 100644 --- a/dbswitch-product/dbswitch-product-hive/src/main/java/com/gitee/dbswitch/product/hive/HiveFeatures.java +++ b/dbswitch-product/dbswitch-product-hive/src/main/java/com/gitee/dbswitch/product/hive/HiveFeatures.java @@ -12,9 +12,5 @@ package com.gitee.dbswitch.product.hive; import com.gitee.dbswitch.features.ProductFeatures; public class HiveFeatures implements ProductFeatures { - - public int convertFetchSize(int fetchSize) { - return Integer.MIN_VALUE; - } - + } diff --git a/dbswitch-product/dbswitch-product-openguass/src/main/java/com/gitee/dbswitch/product/openguass/OpenGaussFactoryProvider.java b/dbswitch-product/dbswitch-product-openguass/src/main/java/com/gitee/dbswitch/product/openguass/OpenGaussFactoryProvider.java index 3804387d..c83fa932 100644 --- a/dbswitch-product/dbswitch-product-openguass/src/main/java/com/gitee/dbswitch/product/openguass/OpenGaussFactoryProvider.java +++ b/dbswitch-product/dbswitch-product-openguass/src/main/java/com/gitee/dbswitch/product/openguass/OpenGaussFactoryProvider.java @@ -28,6 +28,7 @@ public class OpenGaussFactoryProvider extends AbstractFactoryProvider { super(dataSource); } + @Override public ProductFeatures getProductFeatures() { return new OpenGaussFeatures(); } diff --git a/pom.xml b/pom.xml index 01005ccc..bbbd7374 100644 --- a/pom.xml +++ b/pom.xml @@ -19,6 +19,14 @@ UTF-8 + + + tang + inrgihc@126.com + https://gitee.com/inrgihc/dbswitch + + + dbswitch-common dbswitch-core