diff --git a/README.md b/README.md index eefc3e38..107eee4b 100644 --- a/README.md +++ b/README.md @@ -33,29 +33,29 @@ ``` └── dbswitch - ├── dbswitch-common // dbswitch通用定义模块 - ├── dbswitch-core // dbswitch迁移同步实现类 - ├── dbswitch-product // dbswitch数据库方言 - ├── dbswitch-product-mysql // -> mysql方言实现类 - ├── dbswitch-product-oracle // -> oracle方言实现类 - ├── dbswitch-product-sqlserver// -> sqlserver方言实现类 - ├── dbswitch-product-postgres // -> postgres方言实现类 - ├── dbswitch-product-dm // -> dm方言实现类 - ├── dbswitch-product-kingbase // -> kingbase方言实现类 - ├── dbswitch-product-oscar // -> oscar方言实现类 - ├── dbswitch-product-gbase // -> gbase方言实现类 - ├── dbswitch-product-mariadb // -> mariadb方言实现类 - ├── dbswitch-product-openguass// -> openguass方言实现类 - ├── dbswitch-product-db2 // -> db2方言实现类 - ├── dbswitch-product-sybase // -> sybase方言实现类 - ├── dbswitch-product-hive // -> hive方言实现类 - ├── dbswitch-product-sqlite // -> sqlite方言实现类 - ├── dbswitch-product-clickhouse// -> clickhouse方言实现类 - ├── dbswitch-product-mongodb // -> mongodb方言实现类 - ├── dbswitch-data // 工具入口模块,读取配置文件中的参数执行异构迁移同步 - ├── dbswitch-admin // 在以上模块的基础上引入Quartz的调度服务与接口 - ├── dbswitch-admin-ui // 基于Vue2的前段WEB交互页面 - ├── dbswitch-dist // 基于maven-assembly-plugin插件的项目打包模块 + ├── dbswitch-common // dbswitch通用定义模块 + ├── dbswitch-core // dbswitch迁移同步实现类 + ├── dbswitch-product // dbswitch数据库方言 + ├── dbswitch-product-mysql // -> mysql方言实现类 + ├── dbswitch-product-oracle // -> oracle方言实现类 + ├── dbswitch-product-sqlserver // -> sqlserver方言实现类 + ├── dbswitch-product-postgres // -> postgres方言实现类 + ├── dbswitch-product-dm // -> dm方言实现类 + ├── dbswitch-product-kingbase // -> kingbase方言实现类 + ├── dbswitch-product-oscar // -> oscar方言实现类 + ├── dbswitch-product-gbase // -> gbase方言实现类 + ├── dbswitch-product-mariadb // -> mariadb方言实现类 + ├── dbswitch-product-openguass // -> openguass方言实现类 + ├── dbswitch-product-db2 // -> db2方言实现类 + ├── dbswitch-product-sybase // -> sybase方言实现类 + ├── dbswitch-product-hive // -> hive方言实现类 + ├── dbswitch-product-sqlite // -> sqlite方言实现类 + ├── dbswitch-product-clickhouse // -> clickhouse方言实现类 + ├── dbswitch-product-mongodb // -> mongodb方言实现类 + ├── dbswitch-data // 工具入口模块,读取配置文件中的参数执行异构迁移同步 + ├── dbswitch-admin // 在以上模块的基础上引入Quartz的调度服务与接口 + ├── dbswitch-admin-ui // 基于Vue2的前段WEB交互页面 + ├── dbswitch-dist // 基于maven-assembly-plugin插件的项目打包模块 ``` ## 二、编译打包 @@ -132,28 +132,28 @@ dbswitch: source: # source database connection information ## support multiple source database connection - - url: jdbc:oracle:thin:@172.17.2.10:1521:ORCL - driver-class-name: 'oracle.jdbc.driver.OracleDriver' - driver-path: D:/Workspace/dbswitch/driver/oracle/oracle-12c - username: 'system' - password: '123456' - # source database configuration parameters - ## fetch size for query source database - fetch-size: 10000 - ## schema name for query source schemas, separate by ',' - source-schema: 'TANG' - ## table type which include or exclude,option: TABLE,VIEW - table-type: 'TABLE' - ## table name include from table lists, separate by ',' - source-includes: '' - ## table name exclude from table lists, separate by ',' - source-excludes: '' - ## table name convert mapper by regular expression - regex-table-mapper: - - from-pattern: '^' - to-value: 'T_' - ## columns name convert mapper by regular expression like regex-table-mapper - regex-column-mapper: + url: jdbc:oracle:thin:@172.17.2.10:1521:ORCL + driver-class-name: 'oracle.jdbc.driver.OracleDriver' + driver-path: D:/Workspace/dbswitch/driver/oracle/oracle-12c + username: 'system' + password: '123456' + # source database configuration parameters + ## fetch size for query source database + fetch-size: 10000 + ## schema name for query source schemas, separate by ',' + source-schema: 'TANG' + ## table type which include or exclude,option: TABLE,VIEW + table-type: 'TABLE' + ## table name include from table lists, separate by ',' + source-includes: '' + ## table name exclude from table lists, separate by ',' + source-excludes: '' + ## table name convert mapper by regular expression + regex-table-mapper: + - from-pattern: '^' + to-value: 'T_' + ## columns name convert mapper by regular expression like regex-table-mapper + regex-column-mapper: target: # target database connection information @@ -183,21 +183,21 @@ dbswitch: | 配置参数 | 配置说明 | 示例 | 备注 | | :------| :------ | :------ | :------ | -| dbswitch.source[i].url | 来源端JDBC连接的URL | jdbc:oracle:thin:@10.17.1.158:1521:ORCL | 可为:oracle/mysql/mariadb/sqlserver/postgresql/db2/dm/kingbase8/highgo | -| dbswitch.source[i].driver-class-name | 来源端数据库的驱动类名称 | oracle.jdbc.driver.OracleDriver | 对应数据库的驱动类 | -| dbswitch.source[i].driver-path | 来源端数据库的驱动JAR所在目录 | D:/Workspace/dbswitch/driver/oracle/oracle-12c | 对应数据库的驱动JAR所在目录 | -| dbswitch.source[i].username | 来源端连接帐号名 | test | 无 | -| dbswitch.source[i].password | 来源端连接帐号密码 | 123456 | 无 | -| dbswitch.source[i].fetch-size | 来源端数据库查询时的fetch_size设置 | 10000 | 需要大于100有效 | -| dbswitch.source[i].source-schema | 来源端的schema名称 | dbo,test | 多个之间用英文逗号分隔 | -| dbswitch.source[i].table-type | 来源端表的类型 | TABLE | 可选值为:TABLE、VIEW ,分别代表物理表和试图表 | -| dbswitch.source[i].source-includes | 来源端schema下的表中需要包含的表名称 | users1,orgs1 | 支持多个表(多个之间用英文逗号分隔);支持支持正则表达式(不能含有逗号) | -| dbswitch.source[i].source-excludes | 来源端schema下的表中需要过滤的表名称 | users,orgs | 不包含的表名称,多个之间用英文逗号分隔 | -| dbswitch.source[i].regex-table-mapper | 基于正则表达式的表名称映射关系 | [{"from-pattern": "^","to-value": "T_"}] | 为list类型,元素存在顺序关系 | -| dbswitch.source[i].regex-column-mapper | 基于正则表达式的字段名映射关系 | [{"from-pattern": "$","to-value": "_x"}] | 为list类型,元素存在顺序关系 | +| dbswitch.source.url | 来源端JDBC连接的URL | jdbc:oracle:thin:@10.17.1.158:1521:ORCL | 可为:oracle/mysql/mariadb/sqlserver/postgresql/db2/dm/kingbase8/highgo | +| dbswitch.source.driver-class-name | 来源端数据库的驱动类名称 | oracle.jdbc.driver.OracleDriver | 对应数据库的驱动类 | +| dbswitch.source.driver-path | 来源端数据库的驱动JAR所在目录 | D:/Workspace/dbswitch/driver/oracle/oracle-12c | 对应数据库的驱动JAR所在目录 | +| dbswitch.source.username | 来源端连接帐号名 | test | 无 | +| dbswitch.source.password | 来源端连接帐号密码 | 123456 | 无 | +| dbswitch.source.fetch-size | 来源端数据库查询时的fetch_size设置 | 10000 | 需要大于100有效 | +| dbswitch.source.source-schema | 来源端的schema名称 | dbo,test | 多个之间用英文逗号分隔 | +| dbswitch.source.table-type | 来源端表的类型 | TABLE | 可选值为:TABLE、VIEW ,分别代表物理表和试图表 | +| dbswitch.source.source-includes | 来源端schema下的表中需要包含的表名称 | users1,orgs1 | 支持多个表(多个之间用英文逗号分隔);支持支持正则表达式(不能含有逗号) | +| dbswitch.source.source-excludes | 来源端schema下的表中需要过滤的表名称 | users,orgs | 不包含的表名称,多个之间用英文逗号分隔 | +| dbswitch.source.regex-table-mapper | 基于正则表达式的表名称映射关系 | [{"from-pattern": "^","to-value": "T_"}] | 为list类型,元素存在顺序关系 | +| dbswitch.source.regex-column-mapper | 基于正则表达式的字段名映射关系 | [{"from-pattern": "$","to-value": "_x"}] | 为list类型,元素存在顺序关系 | | dbswitch.target.url | 目的端JDBC连接的URL | jdbc:postgresql://10.17.1.90:5432/study | 可为:oracle/sqlserver/postgresql/greenplum,mysql/mariadb/db2/dm/kingbase8/highgo也支持,但字段类型兼容性问题比较多 | | dbswitch.target.driver-class-name |目的端数据库的驱动类名称 | org.postgresql.Driver | 对应数据库的驱动类 | -| dbswitch.source[i].driver-path | 目的端数据库的驱动JAR所在目录 | D:/Workspace/dbswitch/driver/postgresql/postgresql-11.4 | 对应数据库的驱动JAR所在目录 | +| dbswitch.target.driver-path | 目的端数据库的驱动JAR所在目录 | D:/Workspace/dbswitch/driver/postgresql/postgresql-11.4 | 对应数据库的驱动JAR所在目录 | | dbswitch.target.username | 目的端连接帐号名 | test | 无 | | dbswitch.target.password | 目的端连接帐号密码 | 123456 | 无 | | dbswitch.target.target-schema | 目的端的schema名称 | public | 目的端的schema名称只能有且只有一个 | @@ -208,22 +208,19 @@ dbswitch: | dbswitch.target.writer-engine-insert | 是否使用insert写入数据 | false | 可选值为:true为insert写入、false为copy写入,只针对目的端数据库为PostgreSQL/Greenplum的有效 | | dbswitch.target.change-data-sync | 是否启用增量变更同步,dbswitch.target.target-drop为false时且表有主键情况下有效,千万级以上数据量建议设为false | false | 可选值为:true、false | - **注意:** - -- (1)支持源端为多个数据源类型,如果```dbswitch.source[i]```为数组类型,i为编号,从0开始的整数; - -- (2)如果```dbswitch.source[i].source-includes```不为空,则按照包含表的方式来执行; -- (3)如果```dbswitch.source[i].source-includes```为空,则按照```dbswitch.source[i].source-excludes```排除表的方式来执行。 +- (1)如果```dbswitch.source.source-includes```不为空,则按照包含表的方式来执行; -- (4)如果```dbswitch.target.target-drop=false```,```dbswitch.target.change-data-synch=true```;时会对有主键表启用增量变更方式同步 +- (2)如果```dbswitch.source.source-includes```为空,则按照```dbswitch.source.source-excludes```排除表的方式来执行。 -- (5)对于```regex-table-mapper```和```regex-column-mappe```,为基于正则表达式替换的表名映射和字段名映射,均可以为空(代表原名映射,即源的表t_a映射到目的端也为t_a) +- (3)如果```dbswitch.target.target-drop=false```,```dbswitch.target.change-data-synch=true```;时会对有主键表启用增量变更方式同步 + +- (4)对于```regex-table-mapper```和```regex-column-mappe```,为基于正则表达式替换的表名映射和字段名映射,均可以为空(代表原名映射,即源的表t_a映射到目的端也为t_a) > 提示:如果要将源端所有表名(或者字段名)添加前缀,可以配置```"from-pattern": "^","to-value": "T_"```; -- (6)支持的数据库产品及其JDBC驱动连接示例如下: +- (5)支持的数据库产品及其JDBC驱动连接示例如下: **MySQL/MariaDB数据库** @@ -275,7 +272,7 @@ jdbc连接地址:jdbc:db2://172.17.2.10:50000/testdb:driverType=4;fullyMateria jdbc驱动名称:com.ibm.db2.jcc.DB2Driver ``` -**达梦DMDB数据库** +**达梦DM数据库** ``` jdbc连接地址:jdbc:dm://172.17.2.10:5236 @@ -319,7 +316,7 @@ jdbc驱动名称:org.apache.hive.jdbc.HiveDriver 注意:当前只支持hive version 3.x的账号密码认证方式。 -**OpenGuass数据库** +**OpenGauss数据库** ``` jdbc连接地址:dbc:opengauss://172.17.2.10:5866/test @@ -344,9 +341,9 @@ jdbc驱动名称:org.sqlite.JDBC > (a) 本地文件方式:jdbc:sqlite:/tmp/test.db , 该方式适用于dbswitch为实体机器部署的场景。 > > (b) 远程文件方式: jdbc:sqlite::resource:http://172.17.2.12:8080/test.db ,该方式适用于容器方式部署的场景, 搭建文件服务器的方法可使 -> 用如下docker方式快速部署(/home/sqlites为服务器上存放sqlite数据库文件的目录): +> 用如下docker方式快速部署(/home/files为服务器上存放sqlite数据库文件的目录): > -> ```docker run -d --name http_file_server -p 8080:8080 -v /home/sqlites:/data inrgihc/http_file_server:latest``` +> ```docker run -d --name http_file_server -p 8080:8080 -v /home/files:/data inrgihc/http_file_server:latest``` > > 说明:远程服务器文件将会被下载到本地System.getProperty("java.io.tmpdir")所指定的目录下(linux为/tmp/,Windows为C:/temp/),并以 > sqlite-jdbc-tmp-{XXX}.db的方式进行文件命名,其中{XXX}为文件网络地址(例如上述为http://192.168.31.57:8080/test.db) 的字符串哈希值, @@ -563,16 +560,21 @@ cd dbswitch && mvn clean install #### (3)、代码集成开发 ``` -// 构建任务执行的线程池 -AsyncTaskExecutor taskExecutor=new ThreadPoolTaskExecutor(); -taskExecutor.setXXXX(); +// 构建并行读取任务执行的线程池 +AsyncTaskExecutor taskReadExecutor=new ThreadPoolTaskExecutor(); +taskReadExecutor.setXXXX(); + +// 构建并行写入任务执行的线程池 +AsyncTaskExecutor taskWriteExecutor=new ThreadPoolTaskExecutor(); +taskWriteExecutor.setXXXX(); // 构造dbswitch所需的配置参数,参数说明请参考第三章第1小节 -DbswichProperties properties = new DbswichProperties(); -properties.setXXXX(); +DbswichPropertiesConfiguration properties = new DbswichPropertiesConfiguration(); +properties.setSource(XXX); +properties.setTarget(YYY); -// 将参数传递给dbswitch启动同步方式执行 -MigrationService service = new MigrationService(properties, taskExecutor); +// 将参数传递给dbswitch启动迁移同步方式执行 +MigrationService service = new MigrationService(properties, taskReadExecutor, taskWriteExecutor); service.run(); ``` diff --git a/build-docker/build_and_push_image.sh b/build-docker/build_and_push_image.sh index 5a7a9430..a2dc3fd5 100644 --- a/build-docker/build_and_push_image.sh +++ b/build-docker/build_and_push_image.sh @@ -2,7 +2,7 @@ set -e -DBSWITCH_VERSION=1.8.2 +DBSWITCH_VERSION=1.9.0 BUILD_DOCKER_DIR="$( cd "$( dirname "$0" )" && pwd )" PROJECT_ROOT_DIR=$( dirname "$BUILD_DOCKER_DIR") DOCKER_DBSWITCH_DIR=$BUILD_DOCKER_DIR/dbswitch @@ -14,6 +14,7 @@ cd $PROJECT_ROOT_DIR && sh docker-maven-build.sh && cd - cd $BUILD_DOCKER_DIR \ && tar zxvf $PROJECT_ROOT_DIR/target/dbswitch-release-${DBSWITCH_VERSION}.tar.gz -C /tmp \ && cp /tmp/dbswitch-release-${DBSWITCH_VERSION}/lib/* ${BUILD_DOCKER_DIR}/dbswitch/dbswitch-release/lib/ \ + && cp /tmp/dbswitch-release-${DBSWITCH_VERSION}/ext/* ${BUILD_DOCKER_DIR}/dbswitch/dbswitch-release/ext/ \ && cp -r /tmp/dbswitch-release-${DBSWITCH_VERSION}/drivers/* ${BUILD_DOCKER_DIR}/dbswitch/dbswitch-release/drivers/ \ && rm -rf /tmp/dbswitch-release-* diff --git a/build-docker/dbswitch/dbswitch-release/bin/startup.sh b/build-docker/dbswitch/dbswitch-release/bin/startup.sh index 6dbbfea0..18fcdfdb 100644 --- a/build-docker/dbswitch/dbswitch-release/bin/startup.sh +++ b/build-docker/dbswitch/dbswitch-release/bin/startup.sh @@ -18,6 +18,7 @@ APP_HOME="$(cd "$(dirname ${APP_HOME})"; pwd)" APP_BIN_PATH=$APP_HOME/bin APP_LIB_PATH=$APP_HOME/lib +APP_EXT_PATH=$APP_HOME/ext APP_CONF_PATH=$APP_HOME/conf export APP_DRIVERS_PATH=$APP_HOME/drivers @@ -45,5 +46,6 @@ for i in $APP_LIB_PATH/*.jar do CLASSPATH="$i:$CLASSPATH" done +CLASSPATH="$CLASSPATH:$APP_EXT_PATH/*" $JAVA -cp $CLASSPATH $JVMFLAGS $APP_MAIN $APP_CONF_PATH diff --git a/build-docker/dbswitch/dbswitch-release/ext/.gitkeep b/build-docker/dbswitch/dbswitch-release/ext/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/build-docker/install/docker-compose.yml b/build-docker/install/docker-compose.yml index e2b9c0e0..478282a0 100644 --- a/build-docker/install/docker-compose.yml +++ b/build-docker/install/docker-compose.yml @@ -19,7 +19,7 @@ services: start_period: 30s dbswitch: container_name: dbswitch_webui - image: inrgihc/dbswitch:1.8.2 + image: inrgihc/dbswitch:1.9.0 environment: MYSQLDB_HOST: dbswitch_mysqldb MYSQLDB_PORT: 3306 diff --git a/dbswitch-admin/pom.xml b/dbswitch-admin/pom.xml index cd0d9331..a05d1ecc 100644 --- a/dbswitch-admin/pom.xml +++ b/dbswitch-admin/pom.xml @@ -5,7 +5,7 @@ com.gitee.dbswitch dbswitch-parent - 1.8.2 + 1.9.0 dbswitch-admin diff --git a/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/config/ExecutorConfig.java b/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/config/ExecutorConfig.java index 346f8e5f..90b8098d 100644 --- a/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/config/ExecutorConfig.java +++ b/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/config/ExecutorConfig.java @@ -10,26 +10,49 @@ import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; @Configuration("dbswitchExecutorConfig") public class ExecutorConfig { - public final static String TASK_EXECUTOR_BEAN_NAME = "migrationTaskExecutor"; + public final static String TASK_READ_EXECUTOR_BEAN_NAME = "readerTaskExecutor"; + public final static String TASK_WRITE_EXECUTOR_BEAN_NAME = "writerTaskExecutor"; /** - * 创建一个异步任务执行ThreadPoolTaskExecutor + * 创建一个异步读取任务线程池 * * @return ThreadPoolTaskExecutor */ - @Bean(TASK_EXECUTOR_BEAN_NAME) - public AsyncTaskExecutor createTableMigrationTaskExecutor() { + @Bean(TASK_READ_EXECUTOR_BEAN_NAME) + public AsyncTaskExecutor createReaderTaskExecutor() { ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); - taskExecutor.setCorePoolSize(DataSourceUtils.MAX_THREAD_COUNT); - taskExecutor.setMaxPoolSize(DataSourceUtils.MAX_THREAD_COUNT); + taskExecutor.setCorePoolSize(DataSourceUtils.MAX_THREAD_COUNT / 2); + taskExecutor.setMaxPoolSize(DataSourceUtils.MAX_THREAD_COUNT / 2); taskExecutor.setQueueCapacity(10000); taskExecutor.setKeepAliveSeconds(1800); taskExecutor.setDaemon(true); taskExecutor.setThreadGroupName("dbswitch"); - taskExecutor.setThreadNamePrefix("dbswitch-migration-"); - taskExecutor.setBeanName(TASK_EXECUTOR_BEAN_NAME); + taskExecutor.setThreadNamePrefix("dbswitch-reader-"); + taskExecutor.setBeanName(TASK_READ_EXECUTOR_BEAN_NAME); taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); taskExecutor.initialize(); return taskExecutor; } + + /** + * 创建一个异步写入任务线程池 + * + * @return ThreadPoolTaskExecutor + */ + @Bean(TASK_WRITE_EXECUTOR_BEAN_NAME) + public AsyncTaskExecutor createWriterTaskExecutor() { + ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); + taskExecutor.setCorePoolSize(DataSourceUtils.MAX_THREAD_COUNT / 2); + taskExecutor.setMaxPoolSize(DataSourceUtils.MAX_THREAD_COUNT / 2); + taskExecutor.setQueueCapacity(10000); + taskExecutor.setKeepAliveSeconds(1800); + taskExecutor.setDaemon(true); + taskExecutor.setThreadGroupName("dbswitch"); + taskExecutor.setThreadNamePrefix("dbswitch-writer-"); + taskExecutor.setBeanName(TASK_WRITE_EXECUTOR_BEAN_NAME); + taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + taskExecutor.initialize(); + return taskExecutor; + } + } diff --git a/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/execution/ExecuteJobTaskRunnable.java b/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/execution/ExecuteJobTaskRunnable.java index c4033c09..506859d7 100644 --- a/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/execution/ExecuteJobTaskRunnable.java +++ b/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/execution/ExecuteJobTaskRunnable.java @@ -21,12 +21,13 @@ import com.gitee.dbswitch.admin.entity.AssignmentTaskEntity; import com.gitee.dbswitch.admin.logback.LogbackAppenderRegister; import com.gitee.dbswitch.admin.type.JobStatusEnum; import com.gitee.dbswitch.common.entity.MdcKeyValue; -import com.gitee.dbswitch.data.config.DbswichProperties; +import com.gitee.dbswitch.data.config.DbswichPropertiesConfiguration; import com.gitee.dbswitch.data.service.MigrationService; import com.gitee.dbswitch.data.util.JsonUtils; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import java.sql.Timestamp; +import java.util.Objects; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.ReentrantLock; @@ -54,9 +55,12 @@ public class ExecuteJobTaskRunnable implements Runnable { private AssignmentJobDAO assignmentJobDAO; - private AsyncTaskExecutor migrationTaskExecutor; + private AsyncTaskExecutor readerTaskExecutor; - @Getter private Long taskId; + private AsyncTaskExecutor writerTaskExecutor; + + @Getter + private Long taskId; private Integer schedule; @@ -66,8 +70,10 @@ public class ExecuteJobTaskRunnable implements Runnable { this.assignmentTaskDAO = SpringUtil.getBean(AssignmentTaskDAO.class); this.assignmentConfigDAO = SpringUtil.getBean(AssignmentConfigDAO.class); this.assignmentJobDAO = SpringUtil.getBean(AssignmentJobDAO.class); - this.migrationTaskExecutor = SpringUtil.getBean( - ExecutorConfig.TASK_EXECUTOR_BEAN_NAME, AsyncTaskExecutor.class); + this.readerTaskExecutor = SpringUtil.getBean( + ExecutorConfig.TASK_READ_EXECUTOR_BEAN_NAME, AsyncTaskExecutor.class); + this.writerTaskExecutor = SpringUtil.getBean( + ExecutorConfig.TASK_WRITE_EXECUTOR_BEAN_NAME, AsyncTaskExecutor.class); this.taskId = taskId; this.schedule = schedule; this.keyName = keyName; @@ -110,8 +116,8 @@ public class ExecuteJobTaskRunnable implements Runnable { task.getContent()); try { - DbswichProperties properties = JsonUtils.toBeanObject( - task.getContent(), DbswichProperties.class); + DbswichPropertiesConfiguration properties = JsonUtils.toBeanObject( + task.getContent(), DbswichPropertiesConfiguration.class); if (!assignmentConfigEntity.getFirstFlag()) { if (!assignmentConfigEntity.getTargetOnlyCreate()) { properties.getTarget().setTargetDrop(false); @@ -123,7 +129,7 @@ public class ExecuteJobTaskRunnable implements Runnable { properties.getTarget().setTargetDrop(true); } - migrationService = new MigrationService(properties, migrationTaskExecutor); + migrationService = new MigrationService(properties, readerTaskExecutor, writerTaskExecutor); if (interrupted) { log.info("Quartz task id:{} interrupted when prepare stage", taskId); return; @@ -147,11 +153,19 @@ public class ExecuteJobTaskRunnable implements Runnable { } catch (Throwable e) { assignmentJobEntity.setStatus(JobStatusEnum.FAIL.getValue()); assignmentJobEntity.setErrorLog(ExceptionUtil.stacktraceToString(e)); - log.info("Execute Assignment Failed [taskId={},jobId={}],Task Name: {}", - task.getId(), assignmentJobEntity.getId(), task.getName(), e); + log.info("Execute Assignment Failed [taskId={},jobId={}],Task Name: {}, Message: {}", + task.getId(), assignmentJobEntity.getId(), task.getName(), e.getMessage()); } finally { - assignmentJobEntity.setFinishTime(new Timestamp(System.currentTimeMillis())); - assignmentJobDAO.updateSelective(assignmentJobEntity); + AssignmentJobEntity latestJobEntity = assignmentJobDAO.getById(assignmentJobEntity.getId()); + if (Objects.nonNull(latestJobEntity)) { + // 注意,这里有可能用户手动取消任务后,直接删除了任务和这个作业,导致查询不到了 + latestJobEntity.setFinishTime(new Timestamp(System.currentTimeMillis())); + latestJobEntity.setErrorLog(assignmentJobEntity.getErrorLog()); + if (JobStatusEnum.CANCEL.getValue() != latestJobEntity.getStatus()) { + latestJobEntity.setStatus(assignmentJobEntity.getStatus().intValue()); + } + assignmentJobDAO.updateSelective(latestJobEntity); + } } } finally { lock.unlock(); diff --git a/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/listener/DbswitchAdminStartedEventListener.java b/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/listener/DbswitchAdminStartedEventListener.java index 81b66892..9fad5def 100644 --- a/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/listener/DbswitchAdminStartedEventListener.java +++ b/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/listener/DbswitchAdminStartedEventListener.java @@ -12,7 +12,11 @@ public class DbswitchAdminStartedEventListener implements ApplicationListener com.gitee.dbswitch dbswitch-parent - 1.8.2 + 1.9.0 dbswitch-common diff --git a/dbswitch-common/src/main/java/com/gitee/dbswitch/common/entity/JarClassLoader.java b/dbswitch-common/src/main/java/com/gitee/dbswitch/common/entity/JarClassLoader.java index 57309776..2fb4aef8 100644 --- a/dbswitch-common/src/main/java/com/gitee/dbswitch/common/entity/JarClassLoader.java +++ b/dbswitch-common/src/main/java/com/gitee/dbswitch/common/entity/JarClassLoader.java @@ -19,6 +19,11 @@ import java.util.Collections; import java.util.List; import org.apache.commons.lang3.StringUtils; +/** + * 数据库驱动jar的ClassLoader + * + * @author tang + */ public class JarClassLoader extends URLClassLoader { public JarClassLoader(String path, ClassLoader parent) { @@ -42,7 +47,7 @@ public class JarClassLoader extends URLClassLoader { for (String path : dirs) { urls.addAll(doGetURLs(path)); } - if(urls.isEmpty()){ + if (urls.isEmpty()) { throw new RuntimeException("No jar file found from path :" + paths + "!"); } return urls.toArray(new URL[0]); diff --git a/dbswitch-common/src/main/java/com/gitee/dbswitch/common/entity/LoggingSupplier.java b/dbswitch-common/src/main/java/com/gitee/dbswitch/common/entity/LoggingSupplier.java index 48a659de..0ed77bd2 100644 --- a/dbswitch-common/src/main/java/com/gitee/dbswitch/common/entity/LoggingSupplier.java +++ b/dbswitch-common/src/main/java/com/gitee/dbswitch/common/entity/LoggingSupplier.java @@ -20,6 +20,10 @@ public class LoggingSupplier extends AbstractLogging implements Supplier { this.command = command; } + public Supplier getCommand() { + return command; + } + @Override public T get() { try { diff --git a/dbswitch-common/src/main/java/com/gitee/dbswitch/common/entity/PatternMapper.java b/dbswitch-common/src/main/java/com/gitee/dbswitch/common/entity/PatternMapper.java index d6bf82f5..877973ce 100644 --- a/dbswitch-common/src/main/java/com/gitee/dbswitch/common/entity/PatternMapper.java +++ b/dbswitch-common/src/main/java/com/gitee/dbswitch/common/entity/PatternMapper.java @@ -13,6 +13,8 @@ import java.util.Objects; /** * 基于正则表达式的批评替换实体定义 + * + * @author tang */ public class PatternMapper { diff --git a/dbswitch-common/src/main/java/com/gitee/dbswitch/common/entity/PrintablePerfStat.java b/dbswitch-common/src/main/java/com/gitee/dbswitch/common/entity/PrintablePerfStat.java new file mode 100644 index 00000000..1ade61c7 --- /dev/null +++ b/dbswitch-common/src/main/java/com/gitee/dbswitch/common/entity/PrintablePerfStat.java @@ -0,0 +1,20 @@ +// Copyright tang. All rights reserved. +// https://gitee.com/inrgihc/dbswitch +// +// Use of this source code is governed by a BSD-style license +// +// Author: tang (inrgihc@126.com) +// Date : 2020/1/2 +// Location: beijing , china +///////////////////////////////////////////////////////////// +package com.gitee.dbswitch.common.entity; + +/** + * 可打印的统计信息接口 + * + * @author tang + */ +public abstract class PrintablePerfStat { + + public abstract String getPrintableString(); +} diff --git a/dbswitch-common/src/main/java/com/gitee/dbswitch/common/event/TaskEventListener.java b/dbswitch-common/src/main/java/com/gitee/dbswitch/common/event/TaskEventListener.java index b2049ba9..a39af637 100644 --- a/dbswitch-common/src/main/java/com/gitee/dbswitch/common/event/TaskEventListener.java +++ b/dbswitch-common/src/main/java/com/gitee/dbswitch/common/event/TaskEventListener.java @@ -10,12 +10,6 @@ package com.gitee.dbswitch.common.event; public interface TaskEventListener extends java.util.EventListener { - - /** - * The event callback - * - * @param event object - * @return event result - */ + Object event(ListenedEvent event); } \ No newline at end of file diff --git a/dbswitch-common/src/main/java/com/gitee/dbswitch/common/type/CaseConvertEnum.java b/dbswitch-common/src/main/java/com/gitee/dbswitch/common/type/CaseConvertEnum.java index f910e0ba..5a014783 100644 --- a/dbswitch-common/src/main/java/com/gitee/dbswitch/common/type/CaseConvertEnum.java +++ b/dbswitch-common/src/main/java/com/gitee/dbswitch/common/type/CaseConvertEnum.java @@ -11,6 +11,8 @@ package com.gitee.dbswitch.common.type; /** * 处理大小写转换的枚举类 + * + * @author tang */ public enum CaseConvertEnum { NONE(s -> s), diff --git a/dbswitch-common/src/main/java/com/gitee/dbswitch/common/type/TableIndexEnum.java b/dbswitch-common/src/main/java/com/gitee/dbswitch/common/type/TableIndexEnum.java index 3c765a28..052ee1a2 100644 --- a/dbswitch-common/src/main/java/com/gitee/dbswitch/common/type/TableIndexEnum.java +++ b/dbswitch-common/src/main/java/com/gitee/dbswitch/common/type/TableIndexEnum.java @@ -9,6 +9,11 @@ ///////////////////////////////////////////////////////////// package com.gitee.dbswitch.common.type; +/** + * 表的索引类型枚举定义 + * + * @author tang + */ public enum TableIndexEnum { NORMAL("普通索引"), diff --git a/dbswitch-common/src/main/java/com/gitee/dbswitch/common/util/JdbcUrlUtils.java b/dbswitch-common/src/main/java/com/gitee/dbswitch/common/util/JdbcUrlUtils.java index 02a54e3c..56edfab1 100644 --- a/dbswitch-common/src/main/java/com/gitee/dbswitch/common/util/JdbcUrlUtils.java +++ b/dbswitch-common/src/main/java/com/gitee/dbswitch/common/util/JdbcUrlUtils.java @@ -21,8 +21,6 @@ import lombok.experimental.UtilityClass; * JDBC-URL参数提取工具类 * * @author tang - * @date 2021-11-20 22:54:21 - * @since 1.0 */ @UtilityClass public final class JdbcUrlUtils { diff --git a/dbswitch-common/src/main/java/com/gitee/dbswitch/common/util/MachineInfoUtils.java b/dbswitch-common/src/main/java/com/gitee/dbswitch/common/util/MachineInfoUtils.java new file mode 100644 index 00000000..dde9b2c5 --- /dev/null +++ b/dbswitch-common/src/main/java/com/gitee/dbswitch/common/util/MachineInfoUtils.java @@ -0,0 +1,76 @@ +package com.gitee.dbswitch.common.util; + +import java.lang.management.ManagementFactory; +import java.lang.management.MemoryPoolMXBean; +import java.lang.management.MemoryUsage; +import java.lang.management.OperatingSystemMXBean; +import java.text.DecimalFormat; +import java.text.DecimalFormatSymbols; +import java.text.NumberFormat; +import java.util.List; +import java.util.Locale; +import lombok.experimental.UtilityClass; +import lombok.extern.slf4j.Slf4j; + +/** + * 机器统计信息 + */ +@Slf4j +@UtilityClass +public class MachineInfoUtils { + + private static NumberFormat fmtI = new DecimalFormat("###,###", new DecimalFormatSymbols(Locale.ENGLISH)); + + /** + * 获取操作系统信息 + * + * @return String + */ + public static String getOSInfo() { + OperatingSystemMXBean os = ManagementFactory.getOperatingSystemMXBean(); + StringBuffer sb = new StringBuffer(); + sb.append("Operation System Information :" + "\r\n"); + sb.append("OS Name: " + os.getName() + "\r\n"); + sb.append("OS Core Arch : " + os.getArch() + "\r\n"); + sb.append("Available CPU Count: " + os.getAvailableProcessors() + "\r\n"); + sb.append("System Avg Load: " + os.getSystemLoadAverage() + "\r\n"); + sb.append("JAVA Version: " + System.getProperty("java.version") + "\r\n"); + return sb.toString(); + } + + /** + * 日志打印JVM信息 + * + * @return String + */ + public static void printJVMInfo() { + List pools = ManagementFactory.getMemoryPoolMXBeans(); + for (MemoryPoolMXBean pool : pools) { + final String kind = pool.getType().name(); + final MemoryUsage usage = pool.getUsage(); + log.info("model:" + getKindName(kind) + + ", name:" + pool.getName() + + ", init:" + bytesToMB(usage.getInit()) + + ", used:" + bytesToMB(usage.getUsed()) + + ", available:" + bytesToMB(usage.getCommitted()) + + ", max:" + bytesToMB(usage.getMax())); + } + } + + protected static String getKindName(String kind) { + if ("NON_HEAP".equals(kind)) { + return "NonHeap"; + } else { + return "Heap"; + } + } + + protected static String bytesToMB(long bytes) { + return fmtI.format((bytes / 1024 / 1024)) + " MB"; + } + + public static void main(String[] args) { + log.info(getOSInfo()); + printJVMInfo(); + } +} diff --git a/dbswitch-core/pom.xml b/dbswitch-core/pom.xml index 190fcf83..9e69f589 100644 --- a/dbswitch-core/pom.xml +++ b/dbswitch-core/pom.xml @@ -5,7 +5,7 @@ com.gitee.dbswitch dbswitch-parent - 1.8.2 + 1.9.0 dbswitch-core diff --git a/dbswitch-core/src/main/java/com/gitee/dbswitch/calculate/DefaultChangeCalculatorService.java b/dbswitch-core/src/main/java/com/gitee/dbswitch/calculate/DefaultChangeCalculatorService.java index 8c7061a3..974c8cbb 100644 --- a/dbswitch-core/src/main/java/com/gitee/dbswitch/calculate/DefaultChangeCalculatorService.java +++ b/dbswitch-core/src/main/java/com/gitee/dbswitch/calculate/DefaultChangeCalculatorService.java @@ -16,6 +16,7 @@ import com.gitee.dbswitch.common.util.JdbcTypesUtils; import com.gitee.dbswitch.common.util.ObjectCastUtils; import com.gitee.dbswitch.provider.ProductProviderFactory; import com.gitee.dbswitch.provider.query.TableDataQueryProvider; +import com.gitee.dbswitch.provider.transform.RecordTransformProvider; import com.gitee.dbswitch.service.DefaultMetadataService; import com.gitee.dbswitch.service.MetadataService; import java.sql.ResultSet; @@ -282,18 +283,22 @@ public final class DefaultChangeCalculatorService implements RecordRowChangeCalc log.debug("###### Enter CDC calculate now"); } + RecordTransformProvider transformer = task.getTransformer(); + // 进入核心比较计算算法区域 RowChangeTypeEnum flagField = null; Object[] outputRow; Object[] one = getRowData(rsold.getResultSet()); - Object[] two = getRowData(rsnew.getResultSet()); + Object[] two = transformer.doTransform(task.getNewSchemaName(), task.getNewTableName(), + queryFieldColumn, getRowData(rsnew.getResultSet())); while (true) { if (one == null && two == null) { break; } else if (one == null && two != null) { flagField = RowChangeTypeEnum.VALUE_INSERT; outputRow = two; - two = getRowData(rsnew.getResultSet()); + two = transformer.doTransform(task.getNewSchemaName(), task.getNewTableName(), + queryFieldColumn, getRowData(rsnew.getResultSet())); } else if (one != null && two == null) { flagField = RowChangeTypeEnum.VALUE_DELETED; outputRow = one; @@ -311,7 +316,8 @@ public final class DefaultChangeCalculatorService implements RecordRowChangeCalc } one = getRowData(rsold.getResultSet()); - two = getRowData(rsnew.getResultSet()); + two = transformer.doTransform(task.getNewSchemaName(), task.getNewTableName(), + queryFieldColumn, getRowData(rsnew.getResultSet())); } else { if (compare < 0) { flagField = RowChangeTypeEnum.VALUE_DELETED; @@ -320,7 +326,8 @@ public final class DefaultChangeCalculatorService implements RecordRowChangeCalc } else { flagField = RowChangeTypeEnum.VALUE_INSERT; outputRow = two; - two = getRowData(rsnew.getResultSet()); + two = transformer.doTransform(task.getNewSchemaName(), task.getNewTableName(), queryFieldColumn, + getRowData(rsnew.getResultSet())); } } } diff --git a/dbswitch-core/src/main/java/com/gitee/dbswitch/calculate/TaskParamEntity.java b/dbswitch-core/src/main/java/com/gitee/dbswitch/calculate/TaskParamEntity.java index fbbf03ae..b0be2f24 100644 --- a/dbswitch-core/src/main/java/com/gitee/dbswitch/calculate/TaskParamEntity.java +++ b/dbswitch-core/src/main/java/com/gitee/dbswitch/calculate/TaskParamEntity.java @@ -9,6 +9,7 @@ ///////////////////////////////////////////////////////////// package com.gitee.dbswitch.calculate; +import com.gitee.dbswitch.provider.transform.RecordTransformProvider; import java.util.Collections; import java.util.List; import java.util.Map; @@ -75,4 +76,10 @@ public class TaskParamEntity { @NonNull @Builder.Default private Map columnsMap = Collections.emptyMap(); + + /** + * 值转换器 + */ + @NonNull + private RecordTransformProvider transformer; } diff --git a/dbswitch-core/src/main/java/com/gitee/dbswitch/core/exchange/AbstractBatchExchanger.java b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/exchange/AbstractBatchExchanger.java new file mode 100644 index 00000000..9773ae0e --- /dev/null +++ b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/exchange/AbstractBatchExchanger.java @@ -0,0 +1,66 @@ +// Copyright tang. All rights reserved. +// https://gitee.com/inrgihc/dbswitch +// +// Use of this source code is governed by a BSD-style license +// +// Author: tang (inrgihc@126.com) +// Date : 2020/1/2 +// Location: beijing , china +///////////////////////////////////////////////////////////// +package com.gitee.dbswitch.core.exchange; + +import com.gitee.dbswitch.common.util.ExamineUtils; +import com.gitee.dbswitch.core.robot.RobotReader; +import com.gitee.dbswitch.core.robot.RobotWriter; +import org.springframework.core.task.AsyncTaskExecutor; + +public abstract class AbstractBatchExchanger { + + private MemChannel memChannel; + private AsyncTaskExecutor readThreadExecutor; + private AsyncTaskExecutor writeThreadExecutor; + + public AbstractBatchExchanger(AsyncTaskExecutor readExecutor, AsyncTaskExecutor writeExecutor) { + ExamineUtils.checkNotNull(readExecutor, "readExecutor"); + ExamineUtils.checkNotNull(writeExecutor, "writeExecutor"); + this.memChannel = MemChannel.createNewChannel(); + this.readThreadExecutor = readExecutor; + this.writeThreadExecutor = writeExecutor; + } + + public MemChannel getMemChannel() { + return memChannel; + } + + public int getChannelWaitingNum() { + return memChannel.size(); + } + + public void exchange(RobotReader reader, RobotWriter writer) { + // 为reader和writer配置数据传输隧道 + reader.setChannel(this.memChannel); + writer.setChannel(this.memChannel); + + // 初始化reader和writer + reader.init(readThreadExecutor); + writer.init(writeThreadExecutor); + + // 启动reader和writer的并行工作 + writer.work(); + reader.work(); + + // writer会等待reader执行完 + writer.waitForFinish(); + + // 收集统计信息 + Throwable throwable = collectPerfStats(reader, writer); + if (null != throwable) { + if (throwable instanceof RuntimeException) { + throw (RuntimeException) throwable; + } + throw new RuntimeException(throwable); + } + } + + protected abstract Throwable collectPerfStats(RobotReader reader, RobotWriter writer); +} diff --git a/dbswitch-core/src/main/java/com/gitee/dbswitch/core/exchange/BatchElement.java b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/exchange/BatchElement.java new file mode 100644 index 00000000..ebf11004 --- /dev/null +++ b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/exchange/BatchElement.java @@ -0,0 +1,32 @@ +// Copyright tang. All rights reserved. +// https://gitee.com/inrgihc/dbswitch +// +// Use of this source code is governed by a BSD-style license +// +// Author: tang (inrgihc@126.com) +// Date : 2020/1/2 +// Location: beijing , china +///////////////////////////////////////////////////////////// +package com.gitee.dbswitch.core.exchange; + +import java.util.List; +import java.util.function.BiFunction; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class BatchElement { + + private String tableNameMapString; + + private BiFunction, List, Long> handler; + + private List arg1; + + private List arg2; +} diff --git a/dbswitch-core/src/main/java/com/gitee/dbswitch/core/exchange/MemChannel.java b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/exchange/MemChannel.java new file mode 100644 index 00000000..532209ed --- /dev/null +++ b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/exchange/MemChannel.java @@ -0,0 +1,30 @@ +// Copyright tang. All rights reserved. +// https://gitee.com/inrgihc/dbswitch +// +// Use of this source code is governed by a BSD-style license +// +// Author: tang (inrgihc@126.com) +// Date : 2020/1/2 +// Location: beijing , china +///////////////////////////////////////////////////////////// +package com.gitee.dbswitch.core.exchange; + +import java.util.concurrent.ConcurrentLinkedQueue; + +public class MemChannel extends ConcurrentLinkedQueue { + + public static MemChannel createNewChannel() { + return new MemChannel(); + } + + @Override + public boolean add(BatchElement elem) { + return super.add(elem); + } + + @Override + public BatchElement poll() { + return super.poll(); + } + +} diff --git a/dbswitch-core/src/main/java/com/gitee/dbswitch/core/robot/AbstractRobot.java b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/robot/AbstractRobot.java new file mode 100644 index 00000000..77cf2430 --- /dev/null +++ b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/robot/AbstractRobot.java @@ -0,0 +1,40 @@ +// Copyright tang. All rights reserved. +// https://gitee.com/inrgihc/dbswitch +// +// Use of this source code is governed by a BSD-style license +// +// Author: tang (inrgihc@126.com) +// Date : 2020/1/2 +// Location: beijing , china +///////////////////////////////////////////////////////////// +package com.gitee.dbswitch.core.robot; + +import com.gitee.dbswitch.core.exchange.MemChannel; +import com.gitee.dbswitch.core.task.TaskResult; +import java.util.Optional; + +public abstract class AbstractRobot implements Robot { + + private volatile boolean interrupted = false; + private MemChannel channel; + + public void setChannel(MemChannel channel) { + this.channel = channel; + } + + public MemChannel getChannel() { + return channel; + } + + public void interrupt() { + interrupted = true; + } + + protected void checkInterrupt() { + if (interrupted) { + throw new RuntimeException("task is interrupted"); + } + } + + public abstract Optional getWorkResult(); +} diff --git a/dbswitch-core/src/main/java/com/gitee/dbswitch/core/robot/Robot.java b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/robot/Robot.java new file mode 100644 index 00000000..b941d9a3 --- /dev/null +++ b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/robot/Robot.java @@ -0,0 +1,21 @@ +// Copyright tang. All rights reserved. +// https://gitee.com/inrgihc/dbswitch +// +// Use of this source code is governed by a BSD-style license +// +// Author: tang (inrgihc@126.com) +// Date : 2020/1/2 +// Location: beijing , china +///////////////////////////////////////////////////////////// +package com.gitee.dbswitch.core.robot; + +import org.springframework.core.task.AsyncTaskExecutor; + +public interface Robot { + + void init(AsyncTaskExecutor threadExecutor); + + void work(); + + void interrupt(); +} diff --git a/dbswitch-core/src/main/java/com/gitee/dbswitch/core/robot/RobotReader.java b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/robot/RobotReader.java new file mode 100644 index 00000000..f877eb21 --- /dev/null +++ b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/robot/RobotReader.java @@ -0,0 +1,24 @@ +// Copyright tang. All rights reserved. +// https://gitee.com/inrgihc/dbswitch +// +// Use of this source code is governed by a BSD-style license +// +// Author: tang (inrgihc@126.com) +// Date : 2020/1/2 +// Location: beijing , china +///////////////////////////////////////////////////////////// +package com.gitee.dbswitch.core.robot; + +import com.gitee.dbswitch.core.task.TaskResult; + +public abstract class RobotReader extends AbstractRobot { + + public abstract void startRead(); + + public void work() { + checkInterrupt(); + startRead(); + } + + public abstract long getRemainingCount(); +} diff --git a/dbswitch-core/src/main/java/com/gitee/dbswitch/core/robot/RobotWriter.java b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/robot/RobotWriter.java new file mode 100644 index 00000000..d31407b7 --- /dev/null +++ b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/robot/RobotWriter.java @@ -0,0 +1,24 @@ +// Copyright tang. All rights reserved. +// https://gitee.com/inrgihc/dbswitch +// +// Use of this source code is governed by a BSD-style license +// +// Author: tang (inrgihc@126.com) +// Date : 2020/1/2 +// Location: beijing , china +///////////////////////////////////////////////////////////// +package com.gitee.dbswitch.core.robot; + +import com.gitee.dbswitch.core.task.TaskResult; + +public abstract class RobotWriter extends AbstractRobot { + + public abstract void startWrite(); + + public void work() { + checkInterrupt(); + startWrite(); + } + + public abstract void waitForFinish(); +} diff --git a/dbswitch-core/src/main/java/com/gitee/dbswitch/core/task/TaskParam.java b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/task/TaskParam.java new file mode 100644 index 00000000..7ad811f9 --- /dev/null +++ b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/task/TaskParam.java @@ -0,0 +1,14 @@ +// Copyright tang. All rights reserved. +// https://gitee.com/inrgihc/dbswitch +// +// Use of this source code is governed by a BSD-style license +// +// Author: tang (inrgihc@126.com) +// Date : 2020/1/2 +// Location: beijing , china +///////////////////////////////////////////////////////////// +package com.gitee.dbswitch.core.task; + +public interface TaskParam { + +} diff --git a/dbswitch-core/src/main/java/com/gitee/dbswitch/core/task/TaskProcessor.java b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/task/TaskProcessor.java new file mode 100644 index 00000000..5e9f9bf5 --- /dev/null +++ b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/task/TaskProcessor.java @@ -0,0 +1,76 @@ +// Copyright tang. All rights reserved. +// https://gitee.com/inrgihc/dbswitch +// +// Use of this source code is governed by a BSD-style license +// +// Author: tang (inrgihc@126.com) +// Date : 2020/1/2 +// Location: beijing , china +///////////////////////////////////////////////////////////// +package com.gitee.dbswitch.core.task; + +import java.util.function.Supplier; + +public abstract class TaskProcessor implements Supplier { + + private volatile boolean interrupted = false; + + /** + * 中断任务 + */ + public void interrupt() { + this.interrupted = true; + } + + /** + * 任务执行期间用于检查是否接收到任务终端信号 + */ + protected void checkInterrupt() { + if (interrupted) { + throw new RuntimeException("task is interrupted"); + } + } + + /** + * 前置处理准备 + */ + protected void beforeProcess() { + + } + + /** + * 处理过程 + * + * @return R extends TaskResult + */ + protected abstract R doProcess(); + + /** + * 异常处理 + * + * @param t + */ + protected abstract R exceptProcess(Throwable t); + + /** + * 后置处理 + */ + protected void afterProcess() { + + } + + @Override + public R get() { + try { + checkInterrupt(); + beforeProcess(); + checkInterrupt(); + return doProcess(); + } catch (Throwable t) { + return exceptProcess(t); + } finally { + afterProcess(); + } + } + +} diff --git a/dbswitch-core/src/main/java/com/gitee/dbswitch/core/task/TaskResult.java b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/task/TaskResult.java new file mode 100644 index 00000000..6dca9667 --- /dev/null +++ b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/task/TaskResult.java @@ -0,0 +1,14 @@ +// Copyright tang. All rights reserved. +// https://gitee.com/inrgihc/dbswitch +// +// Use of this source code is governed by a BSD-style license +// +// Author: tang (inrgihc@126.com) +// Date : 2020/1/2 +// Location: beijing , china +///////////////////////////////////////////////////////////// +package com.gitee.dbswitch.core.task; + +public interface TaskResult { + +} diff --git a/dbswitch-core/src/main/java/com/gitee/dbswitch/provider/ProductFactoryProvider.java b/dbswitch-core/src/main/java/com/gitee/dbswitch/provider/ProductFactoryProvider.java index 845efc71..9803a4c1 100644 --- a/dbswitch-core/src/main/java/com/gitee/dbswitch/provider/ProductFactoryProvider.java +++ b/dbswitch-core/src/main/java/com/gitee/dbswitch/provider/ProductFactoryProvider.java @@ -11,13 +11,15 @@ package com.gitee.dbswitch.provider; import com.gitee.dbswitch.common.type.ProductTypeEnum; import com.gitee.dbswitch.features.ProductFeatures; +import com.gitee.dbswitch.provider.manage.DefaultTableManageProvider; +import com.gitee.dbswitch.provider.manage.TableManageProvider; import com.gitee.dbswitch.provider.meta.MetadataProvider; -import com.gitee.dbswitch.provider.operate.DefaultTableOperateProvider; -import com.gitee.dbswitch.provider.operate.TableOperateProvider; import com.gitee.dbswitch.provider.query.DefaultTableDataQueryProvider; import com.gitee.dbswitch.provider.query.TableDataQueryProvider; -import com.gitee.dbswitch.provider.sync.DefaultTableDataSynchronizer; -import com.gitee.dbswitch.provider.sync.TableDataSynchronizer; +import com.gitee.dbswitch.provider.sync.DefaultTableDataSynchronizeProvider; +import com.gitee.dbswitch.provider.sync.TableDataSynchronizeProvider; +import com.gitee.dbswitch.provider.transform.MappedTransformProvider; +import com.gitee.dbswitch.provider.transform.RecordTransformProvider; import com.gitee.dbswitch.provider.write.DefaultTableDataWriteProvider; import com.gitee.dbswitch.provider.write.TableDataWriteProvider; import javax.sql.DataSource; @@ -61,6 +63,15 @@ public interface ProductFactoryProvider { return new DefaultTableDataQueryProvider(this); } + /** + * 获取记录转换Provider + * + * @return RecordTransformProvider + */ + default RecordTransformProvider createRecordTransformProvider() { + return new MappedTransformProvider(this); + } + /** * 获取表批量写入Provider * @@ -74,19 +85,19 @@ public interface ProductFactoryProvider { /** * 获取表操作Provider * - * @return TableOperateProvider + * @return TableManageProvider */ - default TableOperateProvider createTableOperateProvider() { - return new DefaultTableOperateProvider(this); + default TableManageProvider createTableManageProvider() { + return new DefaultTableManageProvider(this); } /** * 获取数据同步Provider * - * @return TableDataSynchronizer + * @return TableDataSynchronizeProvider */ - default TableDataSynchronizer createTableDataSynchronizer() { - return new DefaultTableDataSynchronizer(this); + default TableDataSynchronizeProvider createTableDataSynchronizeProvider() { + return new DefaultTableDataSynchronizeProvider(this); } } diff --git a/dbswitch-core/src/main/java/com/gitee/dbswitch/provider/operate/DefaultTableOperateProvider.java b/dbswitch-core/src/main/java/com/gitee/dbswitch/provider/manage/DefaultTableManageProvider.java similarity index 88% rename from dbswitch-core/src/main/java/com/gitee/dbswitch/provider/operate/DefaultTableOperateProvider.java rename to dbswitch-core/src/main/java/com/gitee/dbswitch/provider/manage/DefaultTableManageProvider.java index 1bb3518e..f17ecd2d 100644 --- a/dbswitch-core/src/main/java/com/gitee/dbswitch/provider/operate/DefaultTableOperateProvider.java +++ b/dbswitch-core/src/main/java/com/gitee/dbswitch/provider/manage/DefaultTableManageProvider.java @@ -7,7 +7,7 @@ // Date : 2020/1/2 // Location: beijing , china ///////////////////////////////////////////////////////////// -package com.gitee.dbswitch.provider.operate; +package com.gitee.dbswitch.provider.manage; import com.gitee.dbswitch.provider.AbstractCommonProvider; import com.gitee.dbswitch.provider.ProductFactoryProvider; @@ -17,11 +17,11 @@ import java.sql.Statement; import lombok.extern.slf4j.Slf4j; @Slf4j -public class DefaultTableOperateProvider +public class DefaultTableManageProvider extends AbstractCommonProvider - implements TableOperateProvider { + implements TableManageProvider { - public DefaultTableOperateProvider(ProductFactoryProvider factoryProvider) { + public DefaultTableManageProvider(ProductFactoryProvider factoryProvider) { super(factoryProvider); } diff --git a/dbswitch-core/src/main/java/com/gitee/dbswitch/provider/operate/TableOperateProvider.java b/dbswitch-core/src/main/java/com/gitee/dbswitch/provider/manage/TableManageProvider.java similarity index 88% rename from dbswitch-core/src/main/java/com/gitee/dbswitch/provider/operate/TableOperateProvider.java rename to dbswitch-core/src/main/java/com/gitee/dbswitch/provider/manage/TableManageProvider.java index dc63db1a..09822c5c 100644 --- a/dbswitch-core/src/main/java/com/gitee/dbswitch/provider/operate/TableOperateProvider.java +++ b/dbswitch-core/src/main/java/com/gitee/dbswitch/provider/manage/TableManageProvider.java @@ -7,9 +7,9 @@ // Date : 2020/1/2 // Location: beijing , china ///////////////////////////////////////////////////////////// -package com.gitee.dbswitch.provider.operate; +package com.gitee.dbswitch.provider.manage; -public interface TableOperateProvider { +public interface TableManageProvider { /** * 清除指定表的所有数据 diff --git a/dbswitch-core/src/main/java/com/gitee/dbswitch/provider/sync/AutoCastTableDataSynchronizer.java b/dbswitch-core/src/main/java/com/gitee/dbswitch/provider/sync/AutoCastTableDataSynchronizeProvider.java similarity index 82% rename from dbswitch-core/src/main/java/com/gitee/dbswitch/provider/sync/AutoCastTableDataSynchronizer.java rename to dbswitch-core/src/main/java/com/gitee/dbswitch/provider/sync/AutoCastTableDataSynchronizeProvider.java index 1b35dce5..5f4a9c4d 100644 --- a/dbswitch-core/src/main/java/com/gitee/dbswitch/provider/sync/AutoCastTableDataSynchronizer.java +++ b/dbswitch-core/src/main/java/com/gitee/dbswitch/provider/sync/AutoCastTableDataSynchronizeProvider.java @@ -4,9 +4,9 @@ import com.gitee.dbswitch.common.util.ObjectCastUtils; import com.gitee.dbswitch.provider.ProductFactoryProvider; import java.util.List; -public class AutoCastTableDataSynchronizer extends DefaultTableDataSynchronizer { +public class AutoCastTableDataSynchronizeProvider extends DefaultTableDataSynchronizeProvider { - public AutoCastTableDataSynchronizer(ProductFactoryProvider factoryProvider) { + public AutoCastTableDataSynchronizeProvider(ProductFactoryProvider factoryProvider) { super(factoryProvider); } diff --git a/dbswitch-core/src/main/java/com/gitee/dbswitch/provider/sync/DefaultTableDataSynchronizer.java b/dbswitch-core/src/main/java/com/gitee/dbswitch/provider/sync/DefaultTableDataSynchronizeProvider.java similarity index 98% rename from dbswitch-core/src/main/java/com/gitee/dbswitch/provider/sync/DefaultTableDataSynchronizer.java rename to dbswitch-core/src/main/java/com/gitee/dbswitch/provider/sync/DefaultTableDataSynchronizeProvider.java index be6238cc..d94d4a74 100644 --- a/dbswitch-core/src/main/java/com/gitee/dbswitch/provider/sync/DefaultTableDataSynchronizer.java +++ b/dbswitch-core/src/main/java/com/gitee/dbswitch/provider/sync/DefaultTableDataSynchronizeProvider.java @@ -10,7 +10,6 @@ package com.gitee.dbswitch.provider.sync; import com.gitee.dbswitch.common.type.ProductTypeEnum; -import com.gitee.dbswitch.common.util.ObjectCastUtils; import com.gitee.dbswitch.provider.AbstractCommonProvider; import com.gitee.dbswitch.provider.ProductFactoryProvider; import java.util.ArrayList; @@ -34,8 +33,8 @@ import org.springframework.transaction.TransactionStatus; * @author tang */ @Slf4j -public class DefaultTableDataSynchronizer - extends AbstractCommonProvider implements TableDataSynchronizer { +public class DefaultTableDataSynchronizeProvider + extends AbstractCommonProvider implements TableDataSynchronizeProvider { private JdbcTemplate jdbcTemplate; private PlatformTransactionManager tx; @@ -49,7 +48,7 @@ public class DefaultTableDataSynchronizer protected int[] updateArgsType; protected int[] deleteArgsType; - public DefaultTableDataSynchronizer(ProductFactoryProvider factoryProvider) { + public DefaultTableDataSynchronizeProvider(ProductFactoryProvider factoryProvider) { super(factoryProvider); this.jdbcTemplate = new JdbcTemplate(factoryProvider.getDataSource()); this.tx = new DataSourceTransactionManager(factoryProvider.getDataSource()); diff --git a/dbswitch-core/src/main/java/com/gitee/dbswitch/provider/sync/TableDataSynchronizer.java b/dbswitch-core/src/main/java/com/gitee/dbswitch/provider/sync/TableDataSynchronizeProvider.java similarity index 96% rename from dbswitch-core/src/main/java/com/gitee/dbswitch/provider/sync/TableDataSynchronizer.java rename to dbswitch-core/src/main/java/com/gitee/dbswitch/provider/sync/TableDataSynchronizeProvider.java index dff1c916..6313cbe9 100644 --- a/dbswitch-core/src/main/java/com/gitee/dbswitch/provider/sync/TableDataSynchronizer.java +++ b/dbswitch-core/src/main/java/com/gitee/dbswitch/provider/sync/TableDataSynchronizeProvider.java @@ -19,7 +19,7 @@ import javax.sql.DataSource; * @author tang */ -public interface TableDataSynchronizer { +public interface TableDataSynchronizeProvider { /** * 获取数据库类型 diff --git a/dbswitch-core/src/main/java/com/gitee/dbswitch/provider/transform/ColumnValueDataMapTable.java b/dbswitch-core/src/main/java/com/gitee/dbswitch/provider/transform/ColumnValueDataMapTable.java new file mode 100644 index 00000000..142bbf18 --- /dev/null +++ b/dbswitch-core/src/main/java/com/gitee/dbswitch/provider/transform/ColumnValueDataMapTable.java @@ -0,0 +1,60 @@ +// Copyright tang. All rights reserved. +// https://gitee.com/inrgihc/dbswitch +// +// Use of this source code is governed by a BSD-style license +// +// Author: tang (inrgihc@126.com) +// Date : 2020/1/2 +// Location: beijing , china +///////////////////////////////////////////////////////////// +package com.gitee.dbswitch.provider.transform; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +/** + * 字段值映射关系表 + */ +public class ColumnValueDataMapTable { + + // -> Map + private Map> valueMap = new HashMap<>(); + + public ColumnValueDataMapTable() { + } + + public ColumnValueDataMapTable(SchemaTableColumnTuple tuple, Map values) { + valueMap.clear(); + valueMap.put(tuple, values); + } + + private SchemaTableColumnTuple buildTuple(String schema, String table, String column) { + return SchemaTableColumnTuple + .builder() + .schema(schema) + .table(table) + .column(column) + .build(); + } + + public boolean isEmpty() { + return valueMap.isEmpty(); + } + + public void put(SchemaTableColumnTuple tuple, Map values) { + valueMap.put(tuple, values); + } + + public boolean contains(String schema, String table, String column) { + return valueMap.containsKey(buildTuple(schema, table, column)); + } + + public Map get(String schema, String table, String column) { + Map map = valueMap.get(buildTuple(schema, table, column)); + if (null == map) { + map = Collections.emptyMap(); + } + return map; + } +} diff --git a/dbswitch-core/src/main/java/com/gitee/dbswitch/provider/transform/DefaultTransformProvider.java b/dbswitch-core/src/main/java/com/gitee/dbswitch/provider/transform/DefaultTransformProvider.java new file mode 100644 index 00000000..a6b1267f --- /dev/null +++ b/dbswitch-core/src/main/java/com/gitee/dbswitch/provider/transform/DefaultTransformProvider.java @@ -0,0 +1,40 @@ +// Copyright tang. All rights reserved. +// https://gitee.com/inrgihc/dbswitch +// +// Use of this source code is governed by a BSD-style license +// +// Author: tang (inrgihc@126.com) +// Date : 2020/1/2 +// Location: beijing , china +///////////////////////////////////////////////////////////// +package com.gitee.dbswitch.provider.transform; + +import com.gitee.dbswitch.provider.ProductFactoryProvider; +import java.util.List; + +/** + * 默认的转换器(无转换) + */ +public class DefaultTransformProvider implements RecordTransformProvider { + + private ProductFactoryProvider factoryProvider; + + public DefaultTransformProvider(ProductFactoryProvider factoryProvider) { + this.factoryProvider = factoryProvider; + } + + protected ProductFactoryProvider getFactoryProvider() { + return this.factoryProvider; + } + + @Override + public String getTransformerName() { + return this.getClass().getSimpleName(); + } + + @Override + public Object[] doTransform(String schema, String table, List fieldNames, Object[] recordValue) { + return recordValue; + } + +} diff --git a/dbswitch-core/src/main/java/com/gitee/dbswitch/provider/transform/MappedTransformProvider.java b/dbswitch-core/src/main/java/com/gitee/dbswitch/provider/transform/MappedTransformProvider.java new file mode 100644 index 00000000..e1f4f9cb --- /dev/null +++ b/dbswitch-core/src/main/java/com/gitee/dbswitch/provider/transform/MappedTransformProvider.java @@ -0,0 +1,55 @@ +// Copyright tang. All rights reserved. +// https://gitee.com/inrgihc/dbswitch +// +// Use of this source code is governed by a BSD-style license +// +// Author: tang (inrgihc@126.com) +// Date : 2020/1/2 +// Location: beijing , china +///////////////////////////////////////////////////////////// +package com.gitee.dbswitch.provider.transform; + +import com.gitee.dbswitch.provider.ProductFactoryProvider; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * 支持制定转换字典的转换器 + */ +public class MappedTransformProvider extends DefaultTransformProvider { + + private ColumnValueDataMapTable valueDataMap; + + public MappedTransformProvider(ProductFactoryProvider factoryProvider) { + super(factoryProvider); + this.valueDataMap = new ColumnValueDataMapTable(); + } + + @Override + public String getTransformerName() { + return this.getClass().getSimpleName(); + } + + public void setValueDataMap(ColumnValueDataMapTable valueDataMap) { + this.valueDataMap = Objects.requireNonNull(valueDataMap, "valueDataMap is null"); + } + + @Override + public Object[] doTransform(String schema, String table, List fieldNames, Object[] recordValue) { + if (!valueDataMap.isEmpty()) { + for (int i = 0; i < fieldNames.size(); ++i) { + String column = fieldNames.get(i); + Map mapper = valueDataMap.get(schema, table, column); + if (null != mapper) { + String origin = String.valueOf(recordValue[i]); + if (mapper.containsKey(origin)) { + recordValue[i] = mapper.get(origin); + } + } + } + } + return recordValue; + } + +} diff --git a/dbswitch-core/src/main/java/com/gitee/dbswitch/provider/transform/RecordTransformProvider.java b/dbswitch-core/src/main/java/com/gitee/dbswitch/provider/transform/RecordTransformProvider.java new file mode 100644 index 00000000..125a783a --- /dev/null +++ b/dbswitch-core/src/main/java/com/gitee/dbswitch/provider/transform/RecordTransformProvider.java @@ -0,0 +1,22 @@ +// Copyright tang. All rights reserved. +// https://gitee.com/inrgihc/dbswitch +// +// Use of this source code is governed by a BSD-style license +// +// Author: tang (inrgihc@126.com) +// Date : 2020/1/2 +// Location: beijing , china +///////////////////////////////////////////////////////////// +package com.gitee.dbswitch.provider.transform; + +import java.util.List; + +/** + * 值映射转换器接口 + */ +public interface RecordTransformProvider { + + String getTransformerName(); + + Object[] doTransform(String schema, String table, List fieldNames, Object[] recordValue); +} diff --git a/dbswitch-core/src/main/java/com/gitee/dbswitch/provider/transform/SchemaTableColumnTuple.java b/dbswitch-core/src/main/java/com/gitee/dbswitch/provider/transform/SchemaTableColumnTuple.java new file mode 100644 index 00000000..13263b63 --- /dev/null +++ b/dbswitch-core/src/main/java/com/gitee/dbswitch/provider/transform/SchemaTableColumnTuple.java @@ -0,0 +1,31 @@ +// Copyright tang. All rights reserved. +// https://gitee.com/inrgihc/dbswitch +// +// Use of this source code is governed by a BSD-style license +// +// Author: tang (inrgihc@126.com) +// Date : 2020/1/2 +// Location: beijing , china +///////////////////////////////////////////////////////////// +package com.gitee.dbswitch.provider.transform; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +/** + * Schema/Table/Column三元组定义 + */ +@Data +@Builder +@EqualsAndHashCode +@NoArgsConstructor +@AllArgsConstructor +public class SchemaTableColumnTuple { + + private String schema; + private String table; + private String column; +} diff --git a/dbswitch-data/pom.xml b/dbswitch-data/pom.xml index 681c9948..196dee14 100644 --- a/dbswitch-data/pom.xml +++ b/dbswitch-data/pom.xml @@ -5,7 +5,7 @@ com.gitee.dbswitch dbswitch-parent - 1.8.2 + 1.9.0 dbswitch-data diff --git a/dbswitch-data/src/main/java/com/gitee/dbswitch/data/config/DbswichProperties.java b/dbswitch-data/src/main/java/com/gitee/dbswitch/data/config/DbswichPropertiesConfiguration.java similarity index 79% rename from dbswitch-data/src/main/java/com/gitee/dbswitch/data/config/DbswichProperties.java rename to dbswitch-data/src/main/java/com/gitee/dbswitch/data/config/DbswichPropertiesConfiguration.java index 022dc00f..511e0c46 100644 --- a/dbswitch-data/src/main/java/com/gitee/dbswitch/data/config/DbswichProperties.java +++ b/dbswitch-data/src/main/java/com/gitee/dbswitch/data/config/DbswichPropertiesConfiguration.java @@ -9,10 +9,9 @@ ///////////////////////////////////////////////////////////// package com.gitee.dbswitch.data.config; +import com.gitee.dbswitch.data.entity.GlobalParamConfigProperties; import com.gitee.dbswitch.data.entity.SourceDataSourceProperties; import com.gitee.dbswitch.data.entity.TargetDataSourceProperties; -import java.util.ArrayList; -import java.util.List; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; @@ -23,16 +22,18 @@ import org.springframework.context.annotation.PropertySource; * * @author tang */ -@Configuration @Data +@Configuration @ConfigurationProperties(prefix = "dbswitch") @PropertySource( value = {"classpath:config.properties", "classpath:config.yml", "classpath:config.yaml"}, ignoreResourceNotFound = true, factory = DbswitchPropertySourceFactory.class) -public class DbswichProperties { +public class DbswichPropertiesConfiguration { - private List source = new ArrayList<>(); + private SourceDataSourceProperties source = new SourceDataSourceProperties(); private TargetDataSourceProperties target = new TargetDataSourceProperties(); + + private GlobalParamConfigProperties config = new GlobalParamConfigProperties(); } diff --git a/dbswitch-data/src/main/java/com/gitee/dbswitch/data/config/DbswitchTaskExecutorConfig.java b/dbswitch-data/src/main/java/com/gitee/dbswitch/data/config/DbswitchTaskExecutorConfig.java new file mode 100644 index 00000000..c6106916 --- /dev/null +++ b/dbswitch-data/src/main/java/com/gitee/dbswitch/data/config/DbswitchTaskExecutorConfig.java @@ -0,0 +1,72 @@ +// Copyright tang. All rights reserved. +// https://gitee.com/inrgihc/dbswitch +// +// Use of this source code is governed by a BSD-style license +// +// Author: tang (inrgihc@126.com) +// Date : 2020/1/2 +// Location: beijing , china +///////////////////////////////////////////////////////////// +package com.gitee.dbswitch.data.config; + +import com.gitee.dbswitch.data.util.DataSourceUtils; +import java.util.concurrent.ThreadPoolExecutor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.task.AsyncTaskExecutor; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +/** + * DBSwitch自用线程池定义 + * + * @author tang + */ +@Configuration("dbswitchTaskExecutorConfig") +public class DbswitchTaskExecutorConfig { + + public final static String TASK_EXECUTOR_READ_NAME = "tableReadExecutor"; + public final static String TASK_EXECUTOR_WRITE_NAME = "tableWriteExecutor"; + + /** + * 创建一个异步读任务执行线程池 + * + * @return ThreadPoolTaskExecutor + */ + @Bean(TASK_EXECUTOR_READ_NAME) + public AsyncTaskExecutor createTaskReadeExecutor() { + ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); + taskExecutor.setCorePoolSize(DataSourceUtils.MAX_THREAD_COUNT); + taskExecutor.setMaxPoolSize(DataSourceUtils.MAX_THREAD_COUNT); + taskExecutor.setQueueCapacity(10000); + taskExecutor.setKeepAliveSeconds(1800); + taskExecutor.setDaemon(true); + taskExecutor.setThreadGroupName("dbswitch-reader"); + taskExecutor.setThreadNamePrefix("dbswitch-read-"); + taskExecutor.setBeanName(TASK_EXECUTOR_READ_NAME); + taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + taskExecutor.initialize(); + return taskExecutor; + } + + /** + * 创建一个异步写任务执行线程池 + * + * @return ThreadPoolTaskExecutor + */ + @Bean(TASK_EXECUTOR_WRITE_NAME) + public AsyncTaskExecutor createTaskWriteExecutor() { + ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); + taskExecutor.setCorePoolSize(DataSourceUtils.MAX_THREAD_COUNT); + taskExecutor.setMaxPoolSize(DataSourceUtils.MAX_THREAD_COUNT); + taskExecutor.setQueueCapacity(10000); + taskExecutor.setKeepAliveSeconds(1800); + taskExecutor.setDaemon(true); + taskExecutor.setThreadGroupName("dbswitch-writer"); + taskExecutor.setThreadNamePrefix("dbswitch-write-"); + taskExecutor.setBeanName(TASK_EXECUTOR_WRITE_NAME); + taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + taskExecutor.initialize(); + return taskExecutor; + } + +} diff --git a/dbswitch-data/src/main/java/com/gitee/dbswitch/data/config/TaskExecutorConfig.java b/dbswitch-data/src/main/java/com/gitee/dbswitch/data/config/TaskExecutorConfig.java deleted file mode 100644 index a93911a2..00000000 --- a/dbswitch-data/src/main/java/com/gitee/dbswitch/data/config/TaskExecutorConfig.java +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright tang. All rights reserved. -// https://gitee.com/inrgihc/dbswitch -// -// Use of this source code is governed by a BSD-style license -// -// Author: tang (inrgihc@126.com) -// Date : 2020/1/2 -// Location: beijing , china -///////////////////////////////////////////////////////////// -package com.gitee.dbswitch.data.config; - -import com.gitee.dbswitch.data.util.DataSourceUtils; -import java.util.concurrent.ThreadPoolExecutor; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.core.task.AsyncTaskExecutor; -import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; - -@Configuration("dbswitchTaskExecutorConfig") -public class TaskExecutorConfig { - - public final static String TASK_EXECUTOR_BEAN_NAME = "tableMigrationExecutor"; - - /** - * 创建一个异步任务执行ThreadPoolTaskExecutor - * - * @return ThreadPoolTaskExecutor - */ - @Bean(TASK_EXECUTOR_BEAN_NAME) - public AsyncTaskExecutor createTableMigrationTaskExecutor() { - ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); - taskExecutor.setCorePoolSize(DataSourceUtils.MAX_THREAD_COUNT); - taskExecutor.setMaxPoolSize(DataSourceUtils.MAX_THREAD_COUNT); - taskExecutor.setQueueCapacity(10000); - taskExecutor.setKeepAliveSeconds(1800); - taskExecutor.setDaemon(true); - taskExecutor.setThreadGroupName("dbswitch"); - taskExecutor.setThreadNamePrefix("dbswitch-migration-"); - taskExecutor.setBeanName(TASK_EXECUTOR_BEAN_NAME); - taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); - taskExecutor.initialize(); - return taskExecutor; - } - -} diff --git a/dbswitch-data/src/main/java/com/gitee/dbswitch/data/domain/ComparePerfStat.java b/dbswitch-data/src/main/java/com/gitee/dbswitch/data/domain/ComparePerfStat.java new file mode 100644 index 00000000..4d74da0e --- /dev/null +++ b/dbswitch-data/src/main/java/com/gitee/dbswitch/data/domain/ComparePerfStat.java @@ -0,0 +1,47 @@ +// Copyright tang. All rights reserved. +// https://gitee.com/inrgihc/dbswitch +// +// Use of this source code is governed by a BSD-style license +// +// Author: tang (inrgihc@126.com) +// Date : 2020/1/2 +// Location: beijing , china +///////////////////////////////////////////////////////////// +package com.gitee.dbswitch.data.domain; + +import com.gitee.dbswitch.common.entity.PrintablePerfStat; +import java.util.Map; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 比较信息格式化输出 + * + * @author tang + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ComparePerfStat extends PrintablePerfStat { + + private Map readMap; + + private Map writeMap; + + @Override + public String getPrintableString() { + StringBuilder sb = new StringBuilder(); + if (readMap.size() > 0) { + sb.append("\nTable Detail Information Follows:\n"); + for (Map.Entry entry : readMap.entrySet()) { + String tableMapName = entry.getKey(); + Long tableReadTotal = entry.getValue(); + Long tableWriteTotal = writeMap.getOrDefault(tableMapName, 0L); + sb.append(" " + tableMapName + " [read: " + tableReadTotal + ", write:" + tableWriteTotal + "] \n"); + } + } + return sb.toString(); + } + +} diff --git a/dbswitch-data/src/main/java/com/gitee/dbswitch/data/domain/PerfStat.java b/dbswitch-data/src/main/java/com/gitee/dbswitch/data/domain/PerfStat.java deleted file mode 100644 index 819f5196..00000000 --- a/dbswitch-data/src/main/java/com/gitee/dbswitch/data/domain/PerfStat.java +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright tang. All rights reserved. -// https://gitee.com/inrgihc/dbswitch -// -// Use of this source code is governed by a BSD-style license -// -// Author: tang (inrgihc@126.com) -// Date : 2020/1/2 -// Location: beijing , china -///////////////////////////////////////////////////////////// -package com.gitee.dbswitch.data.domain; - -import cn.hutool.core.io.unit.DataSizeUtil; -import lombok.AllArgsConstructor; -import lombok.Data; - -/** - * 统计信息 - * - * @author tang - */ -@Data -@AllArgsConstructor -public class PerfStat { - - private Integer index; - private Integer total; - private Integer failure; - private Long bytes; - - @Override - public String toString() { - return "Data Source Index: \t" + index + "\n" + - "Total Tables Count: \t" + total + "\n" + - "Failure Tables count: \t" + failure + "\n" + - "Total Transfer Size: \t" + DataSizeUtil.format(bytes) + "\n"; - } -} diff --git a/dbswitch-data/src/main/java/com/gitee/dbswitch/data/domain/ReaderPerfStat.java b/dbswitch-data/src/main/java/com/gitee/dbswitch/data/domain/ReaderPerfStat.java new file mode 100644 index 00000000..28d0fbbc --- /dev/null +++ b/dbswitch-data/src/main/java/com/gitee/dbswitch/data/domain/ReaderPerfStat.java @@ -0,0 +1,45 @@ +// Copyright tang. All rights reserved. +// https://gitee.com/inrgihc/dbswitch +// +// Use of this source code is governed by a BSD-style license +// +// Author: tang (inrgihc@126.com) +// Date : 2020/1/2 +// Location: beijing , china +///////////////////////////////////////////////////////////// +package com.gitee.dbswitch.data.domain; + +import cn.hutool.core.exceptions.ExceptionUtil; +import cn.hutool.core.io.unit.DataSizeUtil; +import com.gitee.dbswitch.common.entity.PrintablePerfStat; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 并发读取统计格式化信息 + * + * @author tang + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ReaderPerfStat extends PrintablePerfStat { + + private long total; + private long failure; + private long bytes; + private Throwable throwable; + + @Override + public String getPrintableString() { + StringBuilder sb = new StringBuilder(); + sb.append("Total Tables Count: \t" + total + "\n" + + "Failure Tables count: \t" + failure + "\n" + + "Total Transfer Size: \t" + DataSizeUtil.format(bytes) + "\n"); + if (null != throwable) { + sb.append("Stack:" + ExceptionUtil.stacktraceToString(throwable)); + } + return sb.toString(); + } +} diff --git a/dbswitch-data/src/main/java/com/gitee/dbswitch/data/domain/ReaderTaskParam.java b/dbswitch-data/src/main/java/com/gitee/dbswitch/data/domain/ReaderTaskParam.java new file mode 100644 index 00000000..7963852a --- /dev/null +++ b/dbswitch-data/src/main/java/com/gitee/dbswitch/data/domain/ReaderTaskParam.java @@ -0,0 +1,42 @@ +// Copyright tang. All rights reserved. +// https://gitee.com/inrgihc/dbswitch +// +// Use of this source code is governed by a BSD-style license +// +// Author: tang (inrgihc@126.com) +// Date : 2020/1/2 +// Location: beijing , china +///////////////////////////////////////////////////////////// +package com.gitee.dbswitch.data.domain; + +import com.gitee.dbswitch.common.entity.CloseableDataSource; +import com.gitee.dbswitch.core.exchange.MemChannel; +import com.gitee.dbswitch.core.task.TaskParam; +import com.gitee.dbswitch.data.config.DbswichPropertiesConfiguration; +import com.gitee.dbswitch.schema.TableDescription; +import java.util.Set; +import java.util.concurrent.CountDownLatch; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 读取任务线程的入参 + * + * @author tang + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ReaderTaskParam implements TaskParam { + + private MemChannel memChannel; + private TableDescription tableDescription; + private DbswichPropertiesConfiguration configuration; + private CloseableDataSource sourceDataSource; + private CloseableDataSource targetDataSource; + private Set targetExistTables; + private CountDownLatch countDownLatch; +} diff --git a/dbswitch-data/src/main/java/com/gitee/dbswitch/data/domain/ReaderTaskResult.java b/dbswitch-data/src/main/java/com/gitee/dbswitch/data/domain/ReaderTaskResult.java new file mode 100644 index 00000000..a0044a1a --- /dev/null +++ b/dbswitch-data/src/main/java/com/gitee/dbswitch/data/domain/ReaderTaskResult.java @@ -0,0 +1,52 @@ +// Copyright tang. All rights reserved. +// https://gitee.com/inrgihc/dbswitch +// +// Use of this source code is governed by a BSD-style license +// +// Author: tang (inrgihc@126.com) +// Date : 2020/1/2 +// Location: beijing , china +///////////////////////////////////////////////////////////// +package com.gitee.dbswitch.data.domain; + +import com.gitee.dbswitch.core.task.TaskResult; +import java.util.HashMap; +import java.util.Map; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 读取任务线程的出参 + * + * @author tang + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ReaderTaskResult implements TaskResult { + + @Builder.Default + private Map perf = new HashMap<>(); + + private String tableNameMapString; + + private long successCount; + + private long failureCount; + + private long recordCount; + + private long totalBytes; + + private Throwable throwable; + + public ReaderTaskResult paddingPerf() { + if (successCount > 0 && null != tableNameMapString) { + perf.put(tableNameMapString, recordCount); + } + return this; + } +} diff --git a/dbswitch-data/src/main/java/com/gitee/dbswitch/data/domain/WriterPerfStat.java b/dbswitch-data/src/main/java/com/gitee/dbswitch/data/domain/WriterPerfStat.java new file mode 100644 index 00000000..5019cd33 --- /dev/null +++ b/dbswitch-data/src/main/java/com/gitee/dbswitch/data/domain/WriterPerfStat.java @@ -0,0 +1,39 @@ +// Copyright tang. All rights reserved. +// https://gitee.com/inrgihc/dbswitch +// +// Use of this source code is governed by a BSD-style license +// +// Author: tang (inrgihc@126.com) +// Date : 2020/1/2 +// Location: beijing , china +///////////////////////////////////////////////////////////// +package com.gitee.dbswitch.data.domain; + +import cn.hutool.core.exceptions.ExceptionUtil; +import com.gitee.dbswitch.common.entity.PrintablePerfStat; + +/** + * 并发写入统计格式化信息 + * + * @author tang + */ +public class WriterPerfStat extends PrintablePerfStat { + + private long duration; + private Throwable throwable; + + public WriterPerfStat(long duration, Throwable throwable) { + this.duration = duration; + this.throwable = throwable; + } + + @Override + public String getPrintableString() { + StringBuilder sb = new StringBuilder(); + sb.append("Total Writer Duration: \t" + (duration / 1000.0) + " s \n"); + if (null != throwable) { + sb.append("Stack:" + ExceptionUtil.stacktraceToString(throwable)); + } + return sb.toString(); + } +} diff --git a/dbswitch-data/src/main/java/com/gitee/dbswitch/data/domain/WriterTaskParam.java b/dbswitch-data/src/main/java/com/gitee/dbswitch/data/domain/WriterTaskParam.java new file mode 100644 index 00000000..17222629 --- /dev/null +++ b/dbswitch-data/src/main/java/com/gitee/dbswitch/data/domain/WriterTaskParam.java @@ -0,0 +1,33 @@ +// Copyright tang. All rights reserved. +// https://gitee.com/inrgihc/dbswitch +// +// Use of this source code is governed by a BSD-style license +// +// Author: tang (inrgihc@126.com) +// Date : 2020/1/2 +// Location: beijing , china +///////////////////////////////////////////////////////////// +package com.gitee.dbswitch.data.domain; + +import com.gitee.dbswitch.core.exchange.MemChannel; +import com.gitee.dbswitch.core.robot.RobotReader; +import com.gitee.dbswitch.core.task.TaskParam; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 写入任务线程的执行结果 + * + * @author tang + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class WriterTaskParam implements TaskParam { + + private MemChannel memChannel; + private RobotReader robotReader; +} diff --git a/dbswitch-data/src/main/java/com/gitee/dbswitch/data/domain/WriterTaskResult.java b/dbswitch-data/src/main/java/com/gitee/dbswitch/data/domain/WriterTaskResult.java new file mode 100644 index 00000000..5a1ede62 --- /dev/null +++ b/dbswitch-data/src/main/java/com/gitee/dbswitch/data/domain/WriterTaskResult.java @@ -0,0 +1,37 @@ +// Copyright tang. All rights reserved. +// https://gitee.com/inrgihc/dbswitch +// +// Use of this source code is governed by a BSD-style license +// +// Author: tang (inrgihc@126.com) +// Date : 2020/1/2 +// Location: beijing , china +///////////////////////////////////////////////////////////// +package com.gitee.dbswitch.data.domain; + +import com.gitee.dbswitch.core.task.TaskResult; +import java.util.HashMap; +import java.util.Map; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 写入任务线程的出参 + * + * @author tang + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class WriterTaskResult implements TaskResult { + + @Builder.Default + private Map perf = new HashMap<>(); + + private boolean success; + private long duration; + private Throwable throwable; +} diff --git a/dbswitch-data/src/main/java/com/gitee/dbswitch/data/entity/GlobalParamConfigProperties.java b/dbswitch-data/src/main/java/com/gitee/dbswitch/data/entity/GlobalParamConfigProperties.java new file mode 100644 index 00000000..2e6c80ed --- /dev/null +++ b/dbswitch-data/src/main/java/com/gitee/dbswitch/data/entity/GlobalParamConfigProperties.java @@ -0,0 +1,23 @@ +// Copyright tang. All rights reserved. +// https://gitee.com/inrgihc/dbswitch +// +// Use of this source code is governed by a BSD-style license +// +// Author: tang (inrgihc@126.com) +// Date : 2020/1/2 +// Location: beijing , china +///////////////////////////////////////////////////////////// +package com.gitee.dbswitch.data.entity; + +import lombok.Data; + +/** + * 全局参数配置 + * + * @author tang + */ +@Data +public class GlobalParamConfigProperties { + + private int writeThreadNum = 4; +} diff --git a/dbswitch-data/src/main/java/com/gitee/dbswitch/data/entity/SourceDataSourceProperties.java b/dbswitch-data/src/main/java/com/gitee/dbswitch/data/entity/SourceDataSourceProperties.java index d6ec4b37..69be1843 100644 --- a/dbswitch-data/src/main/java/com/gitee/dbswitch/data/entity/SourceDataSourceProperties.java +++ b/dbswitch-data/src/main/java/com/gitee/dbswitch/data/entity/SourceDataSourceProperties.java @@ -14,6 +14,11 @@ import java.util.List; import java.util.concurrent.TimeUnit; import lombok.Data; +/** + * 源端参数配置 + * + * @author tang + */ @Data public class SourceDataSourceProperties { diff --git a/dbswitch-data/src/main/java/com/gitee/dbswitch/data/entity/TargetDataSourceProperties.java b/dbswitch-data/src/main/java/com/gitee/dbswitch/data/entity/TargetDataSourceProperties.java index 1a6f80dd..9099df48 100644 --- a/dbswitch-data/src/main/java/com/gitee/dbswitch/data/entity/TargetDataSourceProperties.java +++ b/dbswitch-data/src/main/java/com/gitee/dbswitch/data/entity/TargetDataSourceProperties.java @@ -13,6 +13,11 @@ import com.gitee.dbswitch.common.type.CaseConvertEnum; import java.util.concurrent.TimeUnit; import lombok.Data; +/** + * 目标端参数配置 + * + * @author tang + */ @Data public class TargetDataSourceProperties { @@ -21,6 +26,7 @@ public class TargetDataSourceProperties { private String username; private String password; private String driverPath; + private Long connectionTimeout = TimeUnit.SECONDS.toMillis(60); private Long maxLifeTime = TimeUnit.MINUTES.toMillis(30); diff --git a/dbswitch-data/src/main/java/com/gitee/dbswitch/data/handler/MigrationHandler.java b/dbswitch-data/src/main/java/com/gitee/dbswitch/data/handler/ReaderTaskThread.java similarity index 70% rename from dbswitch-data/src/main/java/com/gitee/dbswitch/data/handler/MigrationHandler.java rename to dbswitch-data/src/main/java/com/gitee/dbswitch/data/handler/ReaderTaskThread.java index bce8fd6d..874f0bc0 100644 --- a/dbswitch-data/src/main/java/com/gitee/dbswitch/data/handler/MigrationHandler.java +++ b/dbswitch-data/src/main/java/com/gitee/dbswitch/data/handler/ReaderTaskThread.java @@ -24,19 +24,26 @@ import com.gitee.dbswitch.common.util.DatabaseAwareUtils; import com.gitee.dbswitch.common.util.ExamineUtils; import com.gitee.dbswitch.common.util.JdbcTypesUtils; import com.gitee.dbswitch.common.util.PatterNameUtils; -import com.gitee.dbswitch.data.config.DbswichProperties; +import com.gitee.dbswitch.core.exchange.BatchElement; +import com.gitee.dbswitch.core.exchange.MemChannel; +import com.gitee.dbswitch.core.task.TaskProcessor; +import com.gitee.dbswitch.data.config.DbswichPropertiesConfiguration; +import com.gitee.dbswitch.data.domain.ReaderTaskParam; +import com.gitee.dbswitch.data.domain.ReaderTaskResult; import com.gitee.dbswitch.data.entity.SourceDataSourceProperties; import com.gitee.dbswitch.provider.ProductFactoryProvider; import com.gitee.dbswitch.provider.ProductProviderFactory; +import com.gitee.dbswitch.provider.manage.TableManageProvider; import com.gitee.dbswitch.provider.meta.MetadataProvider; -import com.gitee.dbswitch.provider.operate.TableOperateProvider; import com.gitee.dbswitch.provider.query.TableDataQueryProvider; -import com.gitee.dbswitch.provider.sync.TableDataSynchronizer; +import com.gitee.dbswitch.provider.sync.TableDataSynchronizeProvider; +import com.gitee.dbswitch.provider.transform.RecordTransformProvider; import com.gitee.dbswitch.provider.write.TableDataWriteProvider; import com.gitee.dbswitch.schema.ColumnDescription; import com.gitee.dbswitch.schema.TableDescription; import com.gitee.dbswitch.service.DefaultMetadataService; import com.gitee.dbswitch.service.MetadataService; +import com.google.common.collect.Lists; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.util.ArrayList; @@ -47,31 +54,32 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.concurrent.CountDownLatch; import java.util.concurrent.atomic.AtomicLong; -import java.util.function.Supplier; import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.util.StringUtils; /** - * 在一个线程内的单表迁移处理逻辑 + * 数据读取线程体(一个表的读) * * @author tang */ @Slf4j -public class MigrationHandler implements Supplier { +public class ReaderTaskThread extends TaskProcessor { private final long MAX_CACHE_BYTES_SIZE = 128 * 1024 * 1024; - private int fetchSize = Constants.MINIMUM_FETCH_SIZE; - private final DbswichProperties properties; + private final DbswichPropertiesConfiguration properties; private final SourceDataSourceProperties sourceProperties; - - private volatile boolean interrupted = false; + private int fetchSize = Constants.MINIMUM_FETCH_SIZE; + private TableDescription tableDescription; + private MemChannel memChannel; // 来源端 private final CloseableDataSource sourceDataSource; + private MetadataService sourceMetaDataService; private ProductTypeEnum sourceProductType; private String sourceSchemaName; private String sourceTableName; @@ -79,8 +87,6 @@ public class MigrationHandler implements Supplier { private List sourceColumnDescriptions; private List sourcePrimaryKeys; - private MetadataService sourceMetaDataService; - // 目的端 private final CloseableDataSource targetDataSource; private ProductTypeEnum targetProductType; @@ -93,28 +99,23 @@ public class MigrationHandler implements Supplier { // 日志输出字符串使用 private String tableNameMapString; - public static MigrationHandler createInstance(TableDescription td, - DbswichProperties properties, - Integer sourcePropertiesIndex, - CloseableDataSource sds, - CloseableDataSource tds, - Set targetExistTables) { - return new MigrationHandler(td, properties, sourcePropertiesIndex, sds, tds, targetExistTables); + private CountDownLatch robotCountDownLatch; + + public ReaderTaskThread(ReaderTaskParam taskParam) { + this.sourceDataSource = taskParam.getSourceDataSource(); + this.targetDataSource = taskParam.getTargetDataSource(); + this.tableDescription = taskParam.getTableDescription(); + this.memChannel = taskParam.getMemChannel(); + this.properties = taskParam.getConfiguration(); + this.sourceProperties = this.properties.getSource(); + this.sourceSchemaName = this.sourceProperties.getSourceSchema(); + this.sourceTableName = this.tableDescription.getTableName(); + this.targetExistTables = taskParam.getTargetExistTables(); + this.robotCountDownLatch = taskParam.getCountDownLatch(); } - private MigrationHandler(TableDescription td, - DbswichProperties properties, - Integer sourcePropertiesIndex, - CloseableDataSource sds, - CloseableDataSource tds, - Set targetExistTables) { - this.sourceSchemaName = td.getSchemaName(); - this.sourceTableName = td.getTableName(); - this.properties = properties; - this.sourceProperties = properties.getSource().get(sourcePropertiesIndex); - this.sourceDataSource = sds; - this.targetDataSource = tds; - + @Override + protected void beforeProcess() { if (sourceProperties.getFetchSize() >= fetchSize) { fetchSize = sourceProperties.getFetchSize(); } @@ -123,19 +124,18 @@ public class MigrationHandler implements Supplier { this.targetProductType = DatabaseAwareUtils.getProductTypeByDataSource(targetDataSource); if (this.targetProductType.isLikeHive()) { - // !! hive does not support upper table name and column name + // !! hive does not support upper table name and upper column name properties.getTarget().setTableNameCase(CaseConvertEnum.LOWER); properties.getTarget().setColumnNameCase(CaseConvertEnum.LOWER); } - this.targetExistTables = targetExistTables; // 获取映射转换后新的表名 this.targetSchemaName = properties.getTarget().getTargetSchema(); this.targetTableName = properties.getTarget() .getTableNameCase() .convert( PatterNameUtils.getFinalName( - td.getTableName(), + tableDescription.getTableName(), sourceProperties.getRegexTableMapper() ) ); @@ -145,16 +145,12 @@ public class MigrationHandler implements Supplier { } this.tableNameMapString = String.format("%s.%s --> %s.%s", - td.getSchemaName(), td.getTableName(), + tableDescription.getSchemaName(), tableDescription.getTableName(), targetSchemaName, targetTableName); } - public void interrupt() { - this.interrupted = true; - } - @Override - public Long get() { + protected ReaderTaskResult doProcess() { log.info("Begin Migrate table for {}", tableNameMapString); this.sourceMetaDataService = new DefaultMetadataService(sourceDataSource, sourceProductType); @@ -162,10 +158,13 @@ public class MigrationHandler implements Supplier { // 读取源表的表及字段元数据 this.sourceTableRemarks = sourceMetaDataService .getTableRemark(sourceSchemaName, sourceTableName); + checkInterrupt(); this.sourceColumnDescriptions = sourceMetaDataService .queryTableColumnMeta(sourceSchemaName, sourceTableName); + checkInterrupt(); this.sourcePrimaryKeys = sourceMetaDataService .queryTablePrimaryKeys(sourceSchemaName, sourceTableName); + checkInterrupt(); // 根据表的列名映射转换准备目标端表的字段信息 this.targetColumnDescriptions = sourceColumnDescriptions.stream() @@ -220,20 +219,20 @@ public class MigrationHandler implements Supplier { if (mapChecker.keySet().size() != valueSet.size()) { throw new RuntimeException("字段映射配置有误,禁止将多个字段映射到一个同名字段!"); } - if (interrupted) { - log.info("task job is interrupted!"); - throw new RuntimeException("task is interrupted"); - } + + checkInterrupt(); + ProductFactoryProvider sourceFactoryProvider = ProductProviderFactory .newProvider(sourceProductType, sourceDataSource); ProductFactoryProvider targetFactoryProvider = ProductProviderFactory .newProvider(targetProductType, targetDataSource); TableDataQueryProvider sourceQuerier = sourceFactoryProvider.createTableDataQueryProvider(); + RecordTransformProvider transformProvider = sourceFactoryProvider.createRecordTransformProvider(); TableDataWriteProvider targetWriter = targetFactoryProvider.createTableDataWriteProvider( properties.getTarget().getWriterEngineInsert()); MetadataProvider targetMetaProvider = targetFactoryProvider.createMetadataQueryProvider(); - TableOperateProvider targetOperator = targetFactoryProvider.createTableOperateProvider(); - TableDataSynchronizer targetSynchronizer = targetFactoryProvider.createTableDataSynchronizer(); + TableManageProvider targetTableManager = targetFactoryProvider.createTableManageProvider(); + TableDataSynchronizeProvider targetSynchronizer = targetFactoryProvider.createTableDataSynchronizeProvider(); if (sourceProductType.isMongodb()) { properties.getTarget().setTargetDrop(true); @@ -241,13 +240,13 @@ public class MigrationHandler implements Supplier { if (targetProductType.isMongodb()) { try { - targetFactoryProvider.createTableOperateProvider() + targetFactoryProvider.createTableManageProvider() .dropTable(targetSchemaName, targetTableName); log.info("Target Table {}.{} is exits, drop it now !", targetSchemaName, targetTableName); } catch (Exception e) { log.info("Target Table {}.{} is not exits, create it!", targetSchemaName, targetTableName); } - return doFullCoverSynchronize(targetWriter, targetOperator, sourceQuerier); + return doFullCoverSynchronize(targetWriter, targetTableManager, sourceQuerier, transformProvider); } else if (properties.getTarget().getTargetDrop() || targetProductType.isLikeHive()) { /* 如果配置了dbswitch.target.datasource-target-drop=true时, @@ -256,7 +255,7 @@ public class MigrationHandler implements Supplier { */ try { - targetFactoryProvider.createTableOperateProvider() + targetFactoryProvider.createTableManageProvider() .dropTable(targetSchemaName, targetTableName); log.info("Target Table {}.{} is exits, drop it now !", targetSchemaName, targetTableName); } catch (Exception e) { @@ -279,6 +278,7 @@ public class MigrationHandler implements Supplier { JdbcTemplate targetJdbcTemplate = new JdbcTemplate(targetDataSource); for (String sql : sqlCreateTable) { + checkInterrupt(); log.info("Execute SQL: \n{}", sql); targetJdbcTemplate.execute(sql); } @@ -286,30 +286,29 @@ public class MigrationHandler implements Supplier { // 如果只想创建表,这里直接返回 if (null != properties.getTarget().getOnlyCreate() && properties.getTarget().getOnlyCreate()) { - return 0L; + return ReaderTaskResult.builder() + .tableNameMapString(tableNameMapString) + .successCount(1).build().paddingPerf(); } if (targetProductType.isLikeHive()) { - return 0L; + return ReaderTaskResult.builder() + .tableNameMapString(tableNameMapString) + .successCount(1).build().paddingPerf(); } - if (interrupted) { - log.info("task job is interrupted!"); - throw new RuntimeException("task is interrupted"); - } - - return doFullCoverSynchronize(targetWriter, targetOperator, sourceQuerier); + checkInterrupt(); + return doFullCoverSynchronize(targetWriter, targetTableManager, sourceQuerier, transformProvider); } else { // 对于只想创建表的情况,不提供后续的变化量数据同步功能 if (null != properties.getTarget().getOnlyCreate() && properties.getTarget().getOnlyCreate()) { - return 0L; + return ReaderTaskResult.builder() + .tableNameMapString(tableNameMapString) + .successCount(1).build().paddingPerf(); } - if (interrupted) { - log.info("task job is interrupted!"); - throw new RuntimeException("task is interrupted"); - } + checkInterrupt(); if (!targetExistTables.contains(targetTableName)) { // 当目标端不存在该表时,则生成建表语句并创建 @@ -332,12 +331,8 @@ public class MigrationHandler implements Supplier { log.info("Execute SQL: \n{}", sql); } - if (interrupted) { - log.info("task job is interrupted!"); - throw new RuntimeException("task is interrupted"); - } - - return doFullCoverSynchronize(targetWriter, targetOperator, sourceQuerier); + checkInterrupt(); + return doFullCoverSynchronize(targetWriter, targetTableManager, sourceQuerier, transformProvider); } // 判断是否具备变化量同步的条件:(1)两端表结构一致,且都有一样的主键字段;(2)MySQL使用Innodb引擎; @@ -354,15 +349,15 @@ public class MigrationHandler implements Supplier { if (targetProductType == ProductTypeEnum.MYSQL && !DatabaseAwareUtils.isMysqlInnodbStorageEngine( targetSchemaName, targetTableName, targetDataSource)) { - return doFullCoverSynchronize(targetWriter, targetOperator, sourceQuerier); + return doFullCoverSynchronize(targetWriter, targetTableManager, sourceQuerier, transformProvider); } else { - return doIncreaseSynchronize(targetSynchronizer); + return doIncreaseSynchronize(targetSynchronizer, transformProvider); } } else { - return doFullCoverSynchronize(targetWriter, targetOperator, sourceQuerier); + return doFullCoverSynchronize(targetWriter, targetTableManager, sourceQuerier, transformProvider); } } else { - return doFullCoverSynchronize(targetWriter, targetOperator, sourceQuerier); + return doFullCoverSynchronize(targetWriter, targetTableManager, sourceQuerier, transformProvider); } } } @@ -370,10 +365,14 @@ public class MigrationHandler implements Supplier { /** * 执行覆盖同步 * - * @param writer 目的端的写入器 + * @param tableWriter + * @param tableManager + * @param sourceQuerier + * @param transformer + * @return ReaderTaskResult */ - private Long doFullCoverSynchronize(TableDataWriteProvider writer, TableOperateProvider operater, - TableDataQueryProvider sourceQuerier) { + private ReaderTaskResult doFullCoverSynchronize(TableDataWriteProvider tableWriter, TableManageProvider tableManager, + TableDataQueryProvider sourceQuerier, RecordTransformProvider transformer) { final int BATCH_SIZE = fetchSize; List sourceFields = new ArrayList<>(); @@ -387,10 +386,10 @@ public class MigrationHandler implements Supplier { } } // 准备目的端的数据写入操作 - writer.prepareWrite(targetSchemaName, targetTableName, targetFields); + tableWriter.prepareWrite(targetSchemaName, targetTableName, targetFields); // 清空目的端表的数据 - operater.truncateTableData(targetSchemaName, targetTableName); + tableManager.truncateTableData(targetSchemaName, targetTableName); // 查询源端数据并写入目的端 sourceQuerier.setQueryFetchSize(BATCH_SIZE); @@ -406,10 +405,7 @@ public class MigrationHandler implements Supplier { try (ResultSet rs = srs.getResultSet()) { ResultSetMetaData metaData = rs.getMetaData(); while (rs.next()) { - if (interrupted) { - log.info("task job is interrupted!"); - throw new RuntimeException("task is interrupted"); - } + checkInterrupt(); Object[] record = new Object[sourceFields.size()]; long bytes = 0; for (int i = 1; i <= sourceFields.size(); ++i) { @@ -424,14 +420,25 @@ public class MigrationHandler implements Supplier { } } - cache.add(record); + cache.add(transformer.doTransform(sourceSchemaName, sourceTableName, sourceFields, record)); cacheBytes += bytes; ++totalCount; if (cache.size() >= BATCH_SIZE || cacheBytes >= MAX_CACHE_BYTES_SIZE) { - long ret = writer.write(targetFields, cache); - log.info("[FullCoverSync] handle table [{}] data count: {}, the batch bytes sie: {}", - tableNameMapString, ret, DataSizeUtil.format(cacheBytes)); + final long finalCacheBytes = cacheBytes; + this.memChannel.add( + BatchElement.builder() + .tableNameMapString(tableNameMapString) + .handler((arg1, arg2) -> { + long ret = tableWriter.write(arg1, arg2); + log.info("[FullCoverSync] handle table [{}] data count: {}, the batch bytes sie: {}", + tableNameMapString, ret, DataSizeUtil.format(finalCacheBytes)); + return ret; + }) + .arg1(Lists.newArrayList(targetFields)) + .arg2(Lists.newArrayList(cache)) + .build() + ); cache.clear(); totalBytes += cacheBytes; cacheBytes = 0; @@ -439,9 +446,20 @@ public class MigrationHandler implements Supplier { } if (cache.size() > 0) { - long ret = writer.write(targetFields, cache); - log.info("[FullCoverSync] handle table [{}] data count: {}, last batch bytes sie: {}", - tableNameMapString, ret, DataSizeUtil.format(cacheBytes)); + final long finalCacheBytes = cacheBytes; + this.memChannel.add( + BatchElement.builder() + .tableNameMapString(tableNameMapString) + .handler((arg1, arg2) -> { + long ret = tableWriter.write(arg1, arg2); + log.info("[FullCoverSync] handle table [{}] data count: {}, the batch bytes sie: {}", + tableNameMapString, ret, DataSizeUtil.format(finalCacheBytes)); + return ret; + }) + .arg1(Lists.newArrayList(targetFields)) + .arg2(Lists.newArrayList(cache)) + .build() + ); cache.clear(); totalBytes += cacheBytes; } @@ -449,20 +467,34 @@ public class MigrationHandler implements Supplier { log.info("[FullCoverSync] handle table [{}] total data count:{}, total bytes={}", tableNameMapString, totalCount, DataSizeUtil.format(totalBytes)); } catch (Exception e) { + if (e instanceof RuntimeException) { + throw (RuntimeException) e; + } throw new RuntimeException(e); } finally { srs.close(); } - return totalBytes; + return ReaderTaskResult + .builder() + .tableNameMapString(tableNameMapString) + .successCount(1) + .failureCount(0) + .totalBytes(totalBytes) + .recordCount(totalCount) + .build() + .paddingPerf(); } /** * 变化量同步 * - * @param synchronizer 目的端的同步器 + * @param synchronizer + * @param transformer + * @return ReaderTaskResult */ - private Long doIncreaseSynchronize(TableDataSynchronizer synchronizer) { + private ReaderTaskResult doIncreaseSynchronize(TableDataSynchronizeProvider synchronizer, + RecordTransformProvider transformer) { final int BATCH_SIZE = fetchSize; List sourceFields = new ArrayList<>(); @@ -487,6 +519,7 @@ public class MigrationHandler implements Supplier { taskBuilder.newTableName(sourceTableName); taskBuilder.fieldColumns(sourceFields); taskBuilder.columnsMap(columnNameMaps); + taskBuilder.transformer(transformer); TaskParamEntity param = taskBuilder.build(); @@ -498,6 +531,7 @@ public class MigrationHandler implements Supplier { calculator.setCheckJdbcType(false); AtomicLong totalBytes = new AtomicLong(0); + AtomicLong totalCount = new AtomicLong(0); // 执行实际的变化同步过程 calculator.executeCalculate(param, new RecordRowHandler() { @@ -531,6 +565,7 @@ public class MigrationHandler implements Supplier { } cacheBytes += bytes; totalBytes.addAndGet(bytes); + totalCount.addAndGet(1); countTotal++; checkFull(fields); } @@ -541,10 +576,7 @@ public class MigrationHandler implements Supplier { * @param fields 同步的字段列表 */ private void checkFull(List fields) { - if (interrupted) { - log.info("task job is interrupted!"); - throw new RuntimeException("task is interrupted"); - } + checkInterrupt(); if (cacheInsert.size() >= BATCH_SIZE || cacheUpdate.size() >= BATCH_SIZE || cacheDelete.size() >= BATCH_SIZE || cacheBytes >= MAX_CACHE_BYTES_SIZE) { if (cacheDelete.size() > 0) { @@ -584,26 +616,64 @@ public class MigrationHandler implements Supplier { } private void doInsert(List fields) { - long ret = synchronizer.executeInsert(cacheInsert); - log.info("[IncreaseSync] Handle table [{}] data Insert count: {}", tableNameMapString, ret); + ReaderTaskThread.this.memChannel.add( + BatchElement.builder() + .tableNameMapString(tableNameMapString) + .handler((arg1, arg2) -> { + long ret = synchronizer.executeInsert(arg2); + log.info("[IncreaseSync] Handle table [{}] data Insert count: {}", tableNameMapString, ret); + return ret; + }) + .arg1(fields) + .arg2(Lists.newArrayList(cacheInsert)) + .build() + ); cacheInsert.clear(); } private void doUpdate(List fields) { - long ret = synchronizer.executeUpdate(cacheUpdate); - log.info("[IncreaseSync] Handle table [{}] data Update count: {}", tableNameMapString, ret); + ReaderTaskThread.this.memChannel.add( + BatchElement.builder() + .tableNameMapString(tableNameMapString) + .handler((arg1, arg2) -> { + long ret = synchronizer.executeUpdate(arg2); + log.info("[IncreaseSync] Handle table [{}] data Update count: {}", tableNameMapString, ret); + return ret; + }) + .arg1(fields) + .arg2(Lists.newArrayList(cacheUpdate)) + .build() + ); cacheUpdate.clear(); } private void doDelete(List fields) { - long ret = synchronizer.executeDelete(cacheDelete); - log.info("[IncreaseSync] Handle table [{}] data Delete count: {}", tableNameMapString, ret); + ReaderTaskThread.this.memChannel.add( + BatchElement.builder() + .tableNameMapString(tableNameMapString) + .handler((arg1, arg2) -> { + long ret = synchronizer.executeDelete(arg2); + log.info("[IncreaseSync] Handle table [{}] data Delete count: {}", tableNameMapString, ret); + return ret; + }) + .arg1(fields) + .arg2(Lists.newArrayList(cacheDelete)) + .build() + ); cacheDelete.clear(); } }); - return totalBytes.get(); + return ReaderTaskResult + .builder() + .tableNameMapString(tableNameMapString) + .successCount(1) + .failureCount(0) + .recordCount(totalCount.get()) + .totalBytes(totalBytes.get()) + .build() + .paddingPerf(); } /** @@ -648,4 +718,22 @@ public class MigrationHandler implements Supplier { return ret; } + @Override + protected ReaderTaskResult exceptProcess(Throwable t) { + log.error("Error migration for table: {}.{}, error message: {}", + tableDescription.getSchemaName(), tableDescription.getTableName(), t.getMessage()); + return ReaderTaskResult.builder() + .successCount(0) + .failureCount(1) + .recordCount(0) + .totalBytes(0) + .throwable(t) + .build() + .paddingPerf(); + } + + @Override + protected void afterProcess() { + robotCountDownLatch.countDown(); + } } diff --git a/dbswitch-data/src/main/java/com/gitee/dbswitch/data/handler/WriterTaskThread.java b/dbswitch-data/src/main/java/com/gitee/dbswitch/data/handler/WriterTaskThread.java new file mode 100644 index 00000000..afa493d8 --- /dev/null +++ b/dbswitch-data/src/main/java/com/gitee/dbswitch/data/handler/WriterTaskThread.java @@ -0,0 +1,80 @@ +// Copyright tang. All rights reserved. +// https://gitee.com/inrgihc/dbswitch +// +// Use of this source code is governed by a BSD-style license +// +// Author: tang (inrgihc@126.com) +// Date : 2020/1/2 +// Location: beijing , china +///////////////////////////////////////////////////////////// +package com.gitee.dbswitch.data.handler; + +import cn.hutool.core.date.StopWatch; +import com.gitee.dbswitch.core.exchange.BatchElement; +import com.gitee.dbswitch.core.exchange.MemChannel; +import com.gitee.dbswitch.core.robot.RobotReader; +import com.gitee.dbswitch.core.task.TaskProcessor; +import com.gitee.dbswitch.data.domain.WriterTaskParam; +import com.gitee.dbswitch.data.domain.WriterTaskResult; +import java.util.Optional; +import lombok.extern.slf4j.Slf4j; + +/** + * 数据写入线程体(多个表的写) + * + * @author tang + */ +@Slf4j +public class WriterTaskThread extends TaskProcessor { + + private final WriterTaskParam taskParam; + + public WriterTaskThread(WriterTaskParam taskParam) { + this.taskParam = taskParam; + } + + @Override + protected WriterTaskResult doProcess() { + MemChannel memChannel = this.taskParam.getMemChannel(); + RobotReader robotReader = this.taskParam.getRobotReader(); + WriterTaskResult taskResult = WriterTaskResult.builder().success(true).build(); + StopWatch stopWatch = new StopWatch(Thread.currentThread().getName()); + stopWatch.start(); + + try { + BatchElement elem; + while ((elem = memChannel.poll()) != null || robotReader.getRemainingCount() > 0) { + checkInterrupt(); + if (null != elem) { + try { + Long ret = Long.valueOf(elem.getArg2().size()); + elem.getHandler().apply(elem.getArg1(), elem.getArg2()); + Long count = taskResult.getPerf().get(elem.getTableNameMapString()); + Long total = ret + Optional.ofNullable(count).orElse(0L); + taskResult.getPerf().put(elem.getTableNameMapString(), total); + } catch (Throwable t) { + log.error("Failed to write table {}", elem.getTableNameMapString(), t); + throw t; + } + } + } + } catch (Throwable t) { + taskResult.setSuccess(false); + taskResult.setThrowable(t); + } finally { + stopWatch.stop(); + taskResult.setDuration(stopWatch.getTotalTimeMillis()); + } + return taskResult; + } + + public WriterTaskResult exceptProcess(Throwable t) { + // 代码不会执行到这里 + return WriterTaskResult.builder() + .success(false) + .duration(0) + .throwable(t) + .build(); + } + +} diff --git a/dbswitch-data/src/main/java/com/gitee/dbswitch/data/service/DefaultBatchExchanger.java b/dbswitch-data/src/main/java/com/gitee/dbswitch/data/service/DefaultBatchExchanger.java new file mode 100644 index 00000000..1b28e3d4 --- /dev/null +++ b/dbswitch-data/src/main/java/com/gitee/dbswitch/data/service/DefaultBatchExchanger.java @@ -0,0 +1,67 @@ +// Copyright tang. All rights reserved. +// https://gitee.com/inrgihc/dbswitch +// +// Use of this source code is governed by a BSD-style license +// +// Author: tang (inrgihc@126.com) +// Date : 2020/1/2 +// Location: beijing , china +///////////////////////////////////////////////////////////// +package com.gitee.dbswitch.data.service; + +import com.gitee.dbswitch.common.entity.PrintablePerfStat; +import com.gitee.dbswitch.core.exchange.AbstractBatchExchanger; +import com.gitee.dbswitch.core.robot.RobotReader; +import com.gitee.dbswitch.core.robot.RobotWriter; +import com.gitee.dbswitch.data.domain.ComparePerfStat; +import com.gitee.dbswitch.data.domain.ReaderPerfStat; +import com.gitee.dbswitch.data.domain.ReaderTaskResult; +import com.gitee.dbswitch.data.domain.WriterPerfStat; +import com.gitee.dbswitch.data.domain.WriterTaskResult; +import java.util.List; +import java.util.Optional; +import org.springframework.core.task.AsyncTaskExecutor; + +/** + * 连接读取和写入的交换器 + * + * @author tang + */ +public class DefaultBatchExchanger extends AbstractBatchExchanger { + + private List perfStats; + + public DefaultBatchExchanger(AsyncTaskExecutor readExecutor, + AsyncTaskExecutor writeExecutor, List perfStats) { + super(readExecutor, writeExecutor); + this.perfStats = perfStats; + } + + @Override + protected Throwable collectPerfStats(RobotReader reader, RobotWriter writer) { + Throwable throwable = null; + Optional readResult = reader.getWorkResult(); + Optional writeResult = writer.getWorkResult(); + if (readResult.isPresent()) { + ReaderTaskResult r = readResult.get(); + long total = r.getSuccessCount() + r.getFailureCount(); + perfStats.add(new ReaderPerfStat(total, r.getFailureCount(), r.getTotalBytes(), r.getThrowable())); + if (null == throwable && null != r.getThrowable()) { + throwable = r.getThrowable(); + } + } + if (writeResult.isPresent()) { + WriterTaskResult w = writeResult.get(); + perfStats.add(new WriterPerfStat(w.getDuration(), w.getThrowable())); + if (null == throwable && null != w.getThrowable()) { + throwable = w.getThrowable(); + } + } + if (readResult.isPresent() && writeResult.isPresent()) { + ReaderTaskResult r = readResult.get(); + WriterTaskResult w = writeResult.get(); + perfStats.add(new ComparePerfStat(r.getPerf(), w.getPerf())); + } + return throwable; + } +} diff --git a/dbswitch-data/src/main/java/com/gitee/dbswitch/data/service/DefaultReaderRobot.java b/dbswitch-data/src/main/java/com/gitee/dbswitch/data/service/DefaultReaderRobot.java new file mode 100644 index 00000000..ce0eda0b --- /dev/null +++ b/dbswitch-data/src/main/java/com/gitee/dbswitch/data/service/DefaultReaderRobot.java @@ -0,0 +1,223 @@ +// Copyright tang. All rights reserved. +// https://gitee.com/inrgihc/dbswitch +// +// Use of this source code is governed by a BSD-style license +// +// Author: tang (inrgihc@126.com) +// Date : 2020/1/2 +// Location: beijing , china +///////////////////////////////////////////////////////////// +package com.gitee.dbswitch.data.service; + +import cn.hutool.core.stream.StreamUtil; +import cn.hutool.core.text.StrPool; +import cn.hutool.core.util.StrUtil; +import com.gitee.dbswitch.common.entity.CloseableDataSource; +import com.gitee.dbswitch.common.entity.LoggingSupplier; +import com.gitee.dbswitch.common.entity.MdcKeyValue; +import com.gitee.dbswitch.core.robot.RobotReader; +import com.gitee.dbswitch.data.config.DbswichPropertiesConfiguration; +import com.gitee.dbswitch.data.domain.ReaderTaskParam; +import com.gitee.dbswitch.data.domain.ReaderTaskResult; +import com.gitee.dbswitch.data.entity.SourceDataSourceProperties; +import com.gitee.dbswitch.data.handler.ReaderTaskThread; +import com.gitee.dbswitch.data.util.JsonUtils; +import com.gitee.dbswitch.schema.TableDescription; +import com.gitee.dbswitch.service.DefaultMetadataService; +import com.gitee.dbswitch.service.MetadataService; +import com.google.common.collect.Maps; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.CountDownLatch; +import java.util.function.Supplier; +import java.util.regex.Pattern; +import java.util.stream.Collectors; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.core.task.AsyncTaskExecutor; + +/** + * 源端数据库表并发读取控制 + * + * @author tang + */ +@Slf4j +public class DefaultReaderRobot extends RobotReader { + + private MdcKeyValue mdcKeyValue; + private DbswichPropertiesConfiguration configuration; + private CloseableDataSource sourceDataSource; + private CloseableDataSource targetDataSource; + private List readTaskThreads; + private List futures; + private AsyncTaskExecutor threadExecutor; + private CountDownLatch countDownLatch; + + public DefaultReaderRobot(MdcKeyValue mdcKeyValue, + DbswichPropertiesConfiguration configuration, + CloseableDataSource sourceDataSource, + CloseableDataSource targetDataSource) { + this.mdcKeyValue = mdcKeyValue; + this.configuration = configuration; + this.sourceDataSource = sourceDataSource; + this.targetDataSource = targetDataSource; + } + + @Override + public void interrupt() { + super.interrupt(); + if (CollectionUtils.isNotEmpty(readTaskThreads)) { + for (Supplier supplier : readTaskThreads) { + if (supplier instanceof ReaderTaskThread) { + ReaderTaskThread thread = (ReaderTaskThread) supplier; + thread.interrupt(); + } else if (supplier instanceof LoggingSupplier) { + LoggingSupplier loggingSupplier = (LoggingSupplier) supplier; + Supplier realSupplier = loggingSupplier.getCommand(); + if (realSupplier instanceof ReaderTaskThread) { + ReaderTaskThread thread = (ReaderTaskThread) realSupplier; + thread.interrupt(); + } + } + } + } + } + + @Override + public void init(AsyncTaskExecutor threadExecutor) { + this.threadExecutor = threadExecutor; + this.readTaskThreads = new ArrayList<>(); + MetadataService tdsService = new DefaultMetadataService(targetDataSource); + Set targetExistTables = tdsService.queryTableList(configuration.getTarget().getTargetSchema()) + .stream().map(TableDescription::getTableName).collect(Collectors.toSet()); + List tableDescriptions = splitReaderTask(); + this.countDownLatch = new CountDownLatch(tableDescriptions.size()); + tableDescriptions.forEach(t -> addReaderTask(t, targetExistTables)); + } + + private void addReaderTask(TableDescription tableDescription, Set targetExistTables) { + ReaderTaskParam param = ReaderTaskParam.builder() + .memChannel(this.getChannel()) + .tableDescription(tableDescription) + .configuration(this.configuration) + .sourceDataSource(sourceDataSource) + .targetDataSource(targetDataSource) + .targetExistTables(targetExistTables) + .countDownLatch(countDownLatch) + .build(); + if (Objects.nonNull(this.mdcKeyValue)) { + this.readTaskThreads.add(new LoggingSupplier(new ReaderTaskThread(param), this.mdcKeyValue)); + } else { + this.readTaskThreads.add(new ReaderTaskThread(param)); + } + } + + private List splitReaderTask() { + List tableDescriptions = new ArrayList<>(); + + MetadataService sourceMetaDataService = new DefaultMetadataService(sourceDataSource); + + // 判断处理的策略:是排除还是包含 + SourceDataSourceProperties sourceProperties = configuration.getSource(); + List includes = + StreamUtil.of(StrUtil.split(sourceProperties.getSourceIncludes(), StrPool.COMMA)) + .collect(Collectors.toList()); + log.info("Includes tables is :{}", JsonUtils.toJsonString(includes)); + List filters = + StreamUtil.of(StrUtil.split(sourceProperties.getSourceExcludes(), StrPool.COMMA)) + .collect(Collectors.toList()); + log.info("Filter tables is :{}", JsonUtils.toJsonString(filters)); + + boolean useExcludeTables = includes.isEmpty(); + if (useExcludeTables) { + log.info("!!!! Use dbswitch.source.source-excludes parameter to filter tables"); + } else { + log.info("!!!! Use dbswitch.source.source-includes parameter to filter tables"); + } + + List schemas = + StreamUtil.of(StrUtil.split(sourceProperties.getSourceSchema(), StrPool.COMMA)) + .collect(Collectors.toList()); + log.info("Source schema names is :{}", JsonUtils.toJsonString(schemas)); + + for (String schema : schemas) { + checkInterrupt(); + List tableList = sourceMetaDataService.queryTableList(schema); + if (tableList.isEmpty()) { + log.warn("### Find source database table list empty for schema name is : {}", schema); + } else { + String allTableType = sourceProperties.getTableType(); + for (TableDescription td : tableList) { + // 当没有配置迁移的表名时,默认为根据类型同步所有 + if (includes.isEmpty()) { + if (null != allTableType && !allTableType.equals(td.getTableType())) { + continue; + } + } + + String tableName = td.getTableName(); + if (useExcludeTables) { + if (!filters.contains(tableName)) { + tableDescriptions.add(td); + } + } else { + if (includes.size() == 1 && (includes.get(0).contains("*") || includes.get(0).contains("?"))) { + if (Pattern.matches(includes.get(0), tableName)) { + tableDescriptions.add(td); + } + } else if (includes.contains(tableName)) { + tableDescriptions.add(td); + } + } + } + } + } + return tableDescriptions; + } + + @Override + public void startRead() { + futures = new ArrayList<>(readTaskThreads.size()); + readTaskThreads.forEach( + task -> { + checkInterrupt(); + futures.add(CompletableFuture.supplyAsync(task, threadExecutor) + ); + } + ); + } + + @Override + public long getRemainingCount() { + return countDownLatch.getCount(); + } + + @Override + public Optional getWorkResult() { + return futures.stream().map(CompletableFuture::join) + .filter(Objects::nonNull) + .map(f -> (ReaderTaskResult) f) + .reduce( + (r1, r2) -> { + Map perf = Maps.newHashMap(r1.getPerf()); + if (r2.getSuccessCount() > 0) { + perf.put(r2.getTableNameMapString(), r2.getRecordCount()); + } + return ReaderTaskResult.builder() + .perf(perf) + .successCount(r1.getSuccessCount() + r2.getSuccessCount()) + .failureCount(r1.getFailureCount() + r2.getFailureCount()) + .recordCount(r1.getRecordCount() + r2.getRecordCount()) + .totalBytes(r1.getTotalBytes() + r2.getTotalBytes()) + .throwable(Objects.nonNull(r1.getThrowable()) ? r1.getThrowable() : r2.getThrowable()) + .build(); + } + ); + } + +} diff --git a/dbswitch-data/src/main/java/com/gitee/dbswitch/data/service/DefaultWriterRobot.java b/dbswitch-data/src/main/java/com/gitee/dbswitch/data/service/DefaultWriterRobot.java new file mode 100644 index 00000000..9ac60a41 --- /dev/null +++ b/dbswitch-data/src/main/java/com/gitee/dbswitch/data/service/DefaultWriterRobot.java @@ -0,0 +1,137 @@ +// Copyright tang. All rights reserved. +// https://gitee.com/inrgihc/dbswitch +// +// Use of this source code is governed by a BSD-style license +// +// Author: tang (inrgihc@126.com) +// Date : 2020/1/2 +// Location: beijing , china +///////////////////////////////////////////////////////////// +package com.gitee.dbswitch.data.service; + +import com.gitee.dbswitch.common.entity.LoggingSupplier; +import com.gitee.dbswitch.common.entity.MdcKeyValue; +import com.gitee.dbswitch.common.util.ExamineUtils; +import com.gitee.dbswitch.core.robot.RobotReader; +import com.gitee.dbswitch.core.robot.RobotWriter; +import com.gitee.dbswitch.data.domain.WriterTaskParam; +import com.gitee.dbswitch.data.domain.WriterTaskResult; +import com.gitee.dbswitch.data.handler.WriterTaskThread; +import com.google.common.collect.Maps; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Supplier; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.core.task.AsyncTaskExecutor; + +/** + * 目标数据库表并发写入控制 + * + * @author tang + */ +@Slf4j +public class DefaultWriterRobot extends RobotWriter { + + private final MdcKeyValue mdcKeyValue; + private final RobotReader robotReader; + private final int writeThreadNum; + private AsyncTaskExecutor threadExecutor; + private List writeTaskThreads; + private List futures; + + public DefaultWriterRobot(MdcKeyValue mdcKeyValue, RobotReader robotReader, int writeThreadNum) { + ExamineUtils.checkState(writeThreadNum > 0, "writeThreadNum(%d) must more than zero", writeThreadNum); + this.mdcKeyValue = mdcKeyValue; + this.robotReader = robotReader; + this.writeThreadNum = writeThreadNum; + } + + @Override + public void interrupt() { + super.interrupt(); + if (CollectionUtils.isNotEmpty(writeTaskThreads)) { + for (Supplier supplier : writeTaskThreads) { + if (supplier instanceof WriterTaskThread) { + WriterTaskThread thread = (WriterTaskThread) supplier; + thread.interrupt(); + } else if (supplier instanceof LoggingSupplier) { + LoggingSupplier loggingSupplier = (LoggingSupplier) supplier; + Supplier realSupplier = loggingSupplier.getCommand(); + if (realSupplier instanceof WriterTaskThread) { + WriterTaskThread thread = (WriterTaskThread) realSupplier; + thread.interrupt(); + } + } + } + } + } + + @Override + public void init(AsyncTaskExecutor threadExecutor) { + this.threadExecutor = threadExecutor; + this.writeTaskThreads = new ArrayList<>(); + + WriterTaskParam param = WriterTaskParam + .builder() + .robotReader(robotReader) + .memChannel(robotReader.getChannel()) + .build(); + for (int i = 0; i < writeThreadNum; ++i) { + checkInterrupt(); + if (Objects.nonNull(mdcKeyValue)) { + writeTaskThreads.add(new LoggingSupplier(new WriterTaskThread(param), mdcKeyValue)); + } else { + writeTaskThreads.add(new WriterTaskThread(param)); + } + } + } + + @Override + public void startWrite() { + futures = new ArrayList<>(writeTaskThreads.size()); + writeTaskThreads.forEach( + task -> { + checkInterrupt(); + futures.add( + CompletableFuture.supplyAsync(task, threadExecutor) + ); + } + ); + } + + @Override + public void waitForFinish() { + checkInterrupt(); + CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join(); + } + + @Override + public Optional getWorkResult() { + return futures.stream().map(CompletableFuture::join) + .filter(Objects::nonNull) + .map(f -> (WriterTaskResult) f) + .reduce( + (r1, r2) -> { + Map perf = Maps.newHashMap(r1.getPerf()); + if (r2.isSuccess()) { + r2.getPerf().forEach((k, v) -> { + Long count = Optional.ofNullable(perf.get(k)).orElse(0L) + v; + perf.put(k, count); + }); + } + return WriterTaskResult.builder() + .perf(perf) + .success(r1.isSuccess() && r2.isSuccess()) + .duration(Math.max(r1.getDuration(), r2.getDuration())) + .throwable(Objects.nonNull(r1.getThrowable()) ? r1.getThrowable() : r2.getThrowable()) + .build(); + } + ); + } + +} diff --git a/dbswitch-data/src/main/java/com/gitee/dbswitch/data/service/MigrationService.java b/dbswitch-data/src/main/java/com/gitee/dbswitch/data/service/MigrationService.java index 8cf220ab..b6f27d04 100644 --- a/dbswitch-data/src/main/java/com/gitee/dbswitch/data/service/MigrationService.java +++ b/dbswitch-data/src/main/java/com/gitee/dbswitch/data/service/MigrationService.java @@ -9,37 +9,21 @@ ///////////////////////////////////////////////////////////// package com.gitee.dbswitch.data.service; -import cn.hutool.core.io.unit.DataSizeUtil; -import cn.hutool.core.stream.StreamUtil; -import cn.hutool.core.text.StrPool; -import cn.hutool.core.util.StrUtil; import com.gitee.dbswitch.common.entity.CloseableDataSource; -import com.gitee.dbswitch.common.entity.LoggingFunction; import com.gitee.dbswitch.common.entity.LoggingRunnable; -import com.gitee.dbswitch.common.entity.LoggingSupplier; import com.gitee.dbswitch.common.entity.MdcKeyValue; -import com.gitee.dbswitch.data.config.DbswichProperties; -import com.gitee.dbswitch.data.domain.PerfStat; -import com.gitee.dbswitch.data.entity.SourceDataSourceProperties; -import com.gitee.dbswitch.data.handler.MigrationHandler; +import com.gitee.dbswitch.common.entity.PrintablePerfStat; +import com.gitee.dbswitch.common.util.MachineInfoUtils; +import com.gitee.dbswitch.core.exchange.AbstractBatchExchanger; +import com.gitee.dbswitch.core.robot.RobotReader; +import com.gitee.dbswitch.core.robot.RobotWriter; +import com.gitee.dbswitch.data.config.DbswichPropertiesConfiguration; +import com.gitee.dbswitch.data.entity.GlobalParamConfigProperties; import com.gitee.dbswitch.data.util.DataSourceUtils; -import com.gitee.dbswitch.data.util.JsonUtils; -import com.gitee.dbswitch.schema.TableDescription; -import com.gitee.dbswitch.service.DefaultMetadataService; -import com.gitee.dbswitch.service.MetadataService; import java.util.ArrayList; import java.util.List; import java.util.Objects; -import java.util.Set; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.concurrent.atomic.AtomicLong; -import java.util.function.Function; -import java.util.function.Supplier; -import java.util.regex.Pattern; -import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.exception.ExceptionUtils; import org.springframework.core.task.AsyncTaskExecutor; import org.springframework.stereotype.Service; import org.springframework.util.StopWatch; @@ -56,27 +40,17 @@ public class MigrationService { /** * 性能统计记录表 */ - private final List perfStats = new ArrayList<>(); - - /** - * 线程是否被中断的标识 - */ - private volatile boolean interrupted = false; - - /** - * 任务列表 - */ - private List migrationHandlers = new ArrayList<>(); + private final List perfStats = new ArrayList<>(); /** * 配置参数 */ - private final DbswichProperties properties; + private final DbswichPropertiesConfiguration configuration; + private final AsyncTaskExecutor tableReadExecutor; + private final AsyncTaskExecutor tableWriteExecutor; - /** - * 任务执行线程池 - */ - private final AsyncTaskExecutor taskExecutor; + private RobotReader robotReader; + private RobotWriter robotWriter; /** * 任务执行实时记录MDC @@ -88,9 +62,12 @@ public class MigrationService { * * @param properties 配置信息 */ - public MigrationService(DbswichProperties properties, AsyncTaskExecutor tableMigrationExecutor) { - this.properties = Objects.requireNonNull(properties, "properties is null"); - this.taskExecutor = Objects.requireNonNull(tableMigrationExecutor, "taskExecutor is null"); + public MigrationService(DbswichPropertiesConfiguration properties, + AsyncTaskExecutor tableReadExecutor, + AsyncTaskExecutor tableWriteExecutor) { + this.configuration = Objects.requireNonNull(properties, "properties is null"); + this.tableReadExecutor = Objects.requireNonNull(tableReadExecutor, "tableReadExecutor is null"); + this.tableWriteExecutor = Objects.requireNonNull(tableWriteExecutor, "tableWriteExecutor is null"); } public void setMdcKeyValue(MdcKeyValue mdcKeyValue) { @@ -101,8 +78,12 @@ public class MigrationService { * 中断执行中的任务 */ synchronized public void interrupt() { - this.interrupted = true; - migrationHandlers.forEach(MigrationHandler::interrupt); + if (null != robotReader) { + robotReader.interrupt(); + } + if (null != robotWriter) { + robotWriter.interrupt(); + } } /** @@ -125,201 +106,34 @@ public class MigrationService { watch.start(); log.info("dbswitch data service is started...."); - //log.info("Application properties configuration \n{}", properties); + log.info(MachineInfoUtils.getOSInfo()); + //log.info("input configuration \n{}", JsonUtils.toJsonString(configuration)); - try (CloseableDataSource targetDataSource = DataSourceUtils.createTargetDataSource(properties.getTarget())) { - MetadataService tdsService = new DefaultMetadataService(targetDataSource); - Set tablesAlreadyExist = tdsService.queryTableList(properties.getTarget().getTargetSchema()) - .stream().map(TableDescription::getTableName).collect(Collectors.toSet()); - int sourcePropertiesIndex = 0; - int totalTableCount = 0; - List sourcesProperties = properties.getSource(); - for (SourceDataSourceProperties sourceProperties : sourcesProperties) { - if (interrupted) { - log.info("task job is interrupted!"); - throw new RuntimeException("task is interrupted"); - } - try (CloseableDataSource sourceDataSource = DataSourceUtils.createSourceDataSource(sourceProperties)) { - MetadataService - sourceMetaDataService = new DefaultMetadataService(sourceDataSource); - - // 判断处理的策略:是排除还是包含 - List includes = - StreamUtil.of(StrUtil.split(sourceProperties.getSourceIncludes(), StrPool.COMMA)) - .collect(Collectors.toList()); - log.info("Includes tables is :{}", JsonUtils.toJsonString(includes)); - List filters = - StreamUtil.of(StrUtil.split(sourceProperties.getSourceExcludes(), StrPool.COMMA)) - .collect(Collectors.toList()); - log.info("Filter tables is :{}", JsonUtils.toJsonString(filters)); - - boolean useExcludeTables = includes.isEmpty(); - if (useExcludeTables) { - log.info("!!!! Use dbswitch.source[{}].source-excludes parameter to filter tables", - sourcePropertiesIndex); - } else { - log.info("!!!! Use dbswitch.source[{}].source-includes parameter to filter tables", - sourcePropertiesIndex); - } - - List> futures = new ArrayList<>(); - - List schemas = - StreamUtil.of(StrUtil.split(sourceProperties.getSourceSchema(), StrPool.COMMA)) - .collect(Collectors.toList()); - log.info("Source schema names is :{}", JsonUtils.toJsonString(schemas)); - - AtomicInteger numberOfFailures = new AtomicInteger(0); - AtomicLong totalBytesSize = new AtomicLong(0L); - final int indexInternal = sourcePropertiesIndex; - for (String schema : schemas) { - if (interrupted) { - log.info("task job is interrupted!"); - break; - } - List tableList = sourceMetaDataService.queryTableList(schema); - if (tableList.isEmpty()) { - log.warn("### Find source database table list empty for schema name is : {}", schema); - } else { - String allTableType = sourceProperties.getTableType(); - for (TableDescription td : tableList) { - // 当没有配置迁移的表名时,默认为根据类型同步所有 - if (includes.isEmpty()) { - if (null != allTableType && !allTableType.equals(td.getTableType())) { - continue; - } - } - - String tableName = td.getTableName(); - - if (useExcludeTables) { - if (!filters.contains(tableName)) { - futures.add( - makeFutureTask(td, indexInternal, sourceDataSource, targetDataSource, tablesAlreadyExist, - numberOfFailures, totalBytesSize)); - } - } else { - if (includes.size() == 1 && (includes.get(0).contains("*") || includes.get(0).contains("?"))) { - if (Pattern.matches(includes.get(0), tableName)) { - futures.add( - makeFutureTask(td, indexInternal, sourceDataSource, targetDataSource, tablesAlreadyExist, - numberOfFailures, totalBytesSize)); - } - } else if (includes.contains(tableName)) { - futures.add( - makeFutureTask(td, indexInternal, sourceDataSource, targetDataSource, tablesAlreadyExist, - numberOfFailures, totalBytesSize)); - } - } - - } - - } - - } - if (!interrupted) { - CompletableFuture.allOf(futures.toArray(new CompletableFuture[]{})).join(); - log.info( - "#### Complete data migration for the [ {} ] data source:\ntotal count={}\nfailure count={}\ntotal bytes size={}", - sourcePropertiesIndex, futures.size(), numberOfFailures.get(), - DataSizeUtil.format(totalBytesSize.get())); - perfStats.add(new PerfStat(sourcePropertiesIndex, futures.size(), - numberOfFailures.get(), totalBytesSize.get())); - ++sourcePropertiesIndex; - totalTableCount += futures.size(); - } - } + GlobalParamConfigProperties config = configuration.getConfig(); + AbstractBatchExchanger exchanger = new DefaultBatchExchanger(tableReadExecutor, tableWriteExecutor, perfStats); + try (CloseableDataSource targetDataSource = DataSourceUtils.createTargetDataSource(configuration.getTarget())) { + try (CloseableDataSource sourceDataSource = DataSourceUtils.createSourceDataSource(configuration.getSource())) { + robotReader = new DefaultReaderRobot(mdcKeyValue, configuration, sourceDataSource, targetDataSource); + robotWriter = new DefaultWriterRobot(mdcKeyValue, robotReader, config.getWriteThreadNum()); + exchanger.exchange(robotReader, robotWriter); } - log.info("service run all success, total migrate table count={} ", totalTableCount); - } catch (RuntimeException e) { - log.error("service run failed:{}", e.getMessage(), e); - throw e; } catch (Throwable t) { - log.error("service run failed:{}", t.getMessage(), ExceptionUtils.getRootCause(t)); + if (t instanceof RuntimeException) { + throw (RuntimeException) t; + } throw new RuntimeException(t); } finally { watch.stop(); log.info("total ellipse = {} s", watch.getTotalTimeSeconds()); StringBuilder sb = new StringBuilder(); - sb.append("===================================\n"); + sb.append("=====================================\n"); sb.append(String.format("total ellipse time:\t %f s\n", watch.getTotalTimeSeconds())); sb.append("-------------------------------------\n"); - perfStats.forEach(st -> { - sb.append(st); - if (perfStats.size() > 1) { - sb.append("-------------------------------------\n"); - } - }); - sb.append("===================================\n"); + perfStats.forEach(st -> sb.append(st.getPrintableString())); + sb.append("=====================================\n"); log.info("\n\n" + sb.toString()); } } - /** - * 构造一个异步执行任务 - * - * @param td 表描述上下文 - * @param indexInternal 源端索引号 - * @param sds 源端的DataSource数据源 - * @param tds 目的端的DataSource数据源 - * @param exists 目的端已经存在的表名列表 - * @param numberOfFailures 失败的数量 - * @param totalBytesSize 同步的字节大小 - * @return CompletableFuture - */ - private CompletableFuture makeFutureTask( - TableDescription td, - Integer indexInternal, - CloseableDataSource sds, - CloseableDataSource tds, - Set exists, - AtomicInteger numberOfFailures, - AtomicLong totalBytesSize) { - return CompletableFuture - .supplyAsync(getMigrateHandler(td, indexInternal, sds, tds, exists), this.taskExecutor) - .exceptionally(getExceptHandler(td, numberOfFailures)) - .thenAccept(totalBytesSize::addAndGet); - } - - /** - * 单表迁移处理方法 - * - * @param td 表描述上下文 - * @param indexInternal 源端索引号 - * @param sds 源端的DataSource数据源 - * @param tds 目的端的DataSource数据源 - * @param exists 目的端已经存在的表名列表 - * @return Supplier - */ - private Supplier getMigrateHandler( - TableDescription td, - Integer indexInternal, - CloseableDataSource sds, - CloseableDataSource tds, - Set exists) { - MigrationHandler instance = MigrationHandler.createInstance(td, properties, indexInternal, sds, tds, exists); - migrationHandlers.add(instance); - return Objects.isNull(mdcKeyValue) ? instance : new LoggingSupplier<>(instance, mdcKeyValue); - } - - /** - * 异常处理函数方法 - * - * @param td 表描述上下文 - * @param numberOfFailures 失败记录数 - * @return Function - */ - private Function getExceptHandler( - TableDescription td, - AtomicInteger numberOfFailures) { - Function function = (e) -> { - log.error("Error migration for table: {}.{}, error message: {}", - td.getSchemaName(), td.getTableName(), e.getMessage()); - numberOfFailures.incrementAndGet(); - throw new RuntimeException(e); - }; - return Objects.isNull(mdcKeyValue) ? function : new LoggingFunction<>(function, mdcKeyValue); - } - } diff --git a/dbswitch-data/src/main/java/com/gitee/dbswitch/data/util/JsonUtils.java b/dbswitch-data/src/main/java/com/gitee/dbswitch/data/util/JsonUtils.java index 33551f90..ddd51ebd 100644 --- a/dbswitch-data/src/main/java/com/gitee/dbswitch/data/util/JsonUtils.java +++ b/dbswitch-data/src/main/java/com/gitee/dbswitch/data/util/JsonUtils.java @@ -20,6 +20,8 @@ import lombok.extern.slf4j.Slf4j; /** * JSON序列化与反序列化工具类 + * + * @author tang */ @Slf4j @UtilityClass diff --git a/dbswitch-data/src/main/resources/config.yml b/dbswitch-data/src/main/resources/config.yml index 9b304c62..bd724edd 100644 --- a/dbswitch-data/src/main/resources/config.yml +++ b/dbswitch-data/src/main/resources/config.yml @@ -3,28 +3,28 @@ dbswitch: # source database connection information ## support MySQL/MariaDB/DB2/DM/Kingbase8/Oracle/SQLServer/PostgreSQL/Greenplum etc. ## support multiple source database connection - - url: jdbc:mysql://172.17.2.10:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&tinyInt1isBit=false&rewriteBatchedStatements=true&useCompression=true - driver-class-name: 'com.mysql.jdbc.Driver' - driver-path: D:\Workspace\IdeaProjects\dbswitch\drivers\mysql\mysql-5 - username: 'test' - password: '123456' - # source database configuration parameters - ## fetch size for query source database - fetch-size: 10000 - ## schema name for query source schemas, separate by ',' - source-schema: 'test' - ## table type which include or exclude,option: TABLE,VIEW - table-type: 'TABLE' - ## table name include from table lists, separate by ',' - source-includes: '' - ## table name exclude from table lists, separate by ',' - source-excludes: '' - ## table name convert mapper by regular expression - regex-table-mapper: - - from-pattern: '^' - to-value: 'T_' - ## columns name convert mapper by regular expression like regex-table-mapper - regex-column-mapper: + url: jdbc:mysql://172.17.2.10:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&tinyInt1isBit=false&rewriteBatchedStatements=true&useCompression=true + driver-class-name: 'com.mysql.jdbc.Driver' + driver-path: D:\Workspace\IdeaProjects\dbswitch\drivers\mysql\mysql-5 + username: 'test' + password: '123456' + # source database configuration parameters + ## fetch size for query source database + fetch-size: 10000 + ## schema name for query source schemas, separate by ',' + source-schema: 'test' + ## table type which include or exclude,option: TABLE,VIEW + table-type: 'TABLE' + ## table name include from table lists, separate by ',' + source-includes: '' + ## table name exclude from table lists, separate by ',' + source-excludes: '' + ## table name convert mapper by regular expression + regex-table-mapper: + - from-pattern: '^' + to-value: 'T_' + ## columns name convert mapper by regular expression like regex-table-mapper + regex-column-mapper: target: # target database connection information diff --git a/dbswitch-dist/pom.xml b/dbswitch-dist/pom.xml index 2f74a267..f47980c6 100644 --- a/dbswitch-dist/pom.xml +++ b/dbswitch-dist/pom.xml @@ -5,7 +5,7 @@ com.gitee.dbswitch dbswitch-parent - 1.8.2 + 1.9.0 dbswitch-dist diff --git a/dbswitch-dist/src/main/assembly/assembly.xml b/dbswitch-dist/src/main/assembly/assembly.xml index 5b9cc8d8..ccddd7d9 100644 --- a/dbswitch-dist/src/main/assembly/assembly.xml +++ b/dbswitch-dist/src/main/assembly/assembly.xml @@ -26,6 +26,15 @@ + + + ${project.basedir} + ext + + **/* + + + ${project.parent.basedir}/dbswitch-admin/src/main/resources/ @@ -83,11 +92,24 @@ ${project.parent.basedir}/dbswitch-admin/target lib + + dbswitch-admin-*.jar + *.jar + + + ${project.parent.basedir}/dbswitch-admin/target + + ext + + dbswitch-admin-*.jar + + + ${project.parent.basedir}/dbswitch-product/dbswitch-register-product/target diff --git a/dbswitch-dist/src/main/assembly/bin/startup.cmd b/dbswitch-dist/src/main/assembly/bin/startup.cmd index b5cc48b2..ed9598da 100644 --- a/dbswitch-dist/src/main/assembly/bin/startup.cmd +++ b/dbswitch-dist/src/main/assembly/bin/startup.cmd @@ -18,6 +18,7 @@ set APP_HOME=%cd% set APP_BIN_PATH=%APP_HOME%\bin set APP_LIB_PATH=%APP_HOME%\lib +set APP_EXT_PATH=%APP_HOME%\ext set APP_CONF_PATH=%APP_HOME%\conf set APP_DRIVERS_PATH=%APP_HOME%\drivers @@ -32,15 +33,15 @@ echo OS=%OS% echo. echo APP_HOME=%APP_HOME% echo APP_MAINCLASS=%APP_MAINCLASS% -echo CLASSPATH=%APP_CONF_PATH%;%APP_LIB_PATH%\* +echo CLASSPATH=%APP_CONF_PATH%;%APP_LIB_PATH%\*;%APP_EXT_PATH%\* echo CURRENT_DATE=%date% %time%:~0,8% echo ******************************************************** ::执行java echo Starting %APP_MAINCLASS% ... -echo java -classpath %APP_CONF_PATH%;%APP_LIB_PATH%\* %JAVA_OPTS% %APP_MAINCLASS% +echo java -classpath %APP_CONF_PATH%;%APP_LIB_PATH%\*;%APP_EXT_PATH%\* %JAVA_OPTS% %APP_MAINCLASS% echo . -java -classpath %APP_CONF_PATH%;%APP_LIB_PATH%\* %JAVA_OPTS% %APP_MAINCLASS% +java -classpath %APP_CONF_PATH%;%APP_LIB_PATH%\*;%APP_EXT_PATH%\* %JAVA_OPTS% %APP_MAINCLASS% :exit pause diff --git a/dbswitch-dist/src/main/assembly/bin/startup.sh b/dbswitch-dist/src/main/assembly/bin/startup.sh index ed9cb13c..39e39a27 100644 --- a/dbswitch-dist/src/main/assembly/bin/startup.sh +++ b/dbswitch-dist/src/main/assembly/bin/startup.sh @@ -18,6 +18,7 @@ APP_HOME="$(cd "$(dirname ${APP_HOME})"; pwd)" APP_BIN_PATH=$APP_HOME/bin APP_LIB_PATH=$APP_HOME/lib +APP_EXT_PATH=$APP_HOME/ext APP_CONF_PATH=$APP_HOME/conf export APP_DRIVERS_PATH=$APP_HOME/drivers @@ -45,6 +46,7 @@ for i in $APP_LIB_PATH/*.jar do CLASSPATH="$i:$CLASSPATH" done +CLASSPATH="$CLASSPATH:$APP_EXT_PATH/*" res=`ps aux|grep java|grep $APP_HOME|grep $APP_MAIN|grep -v grep|awk '{print $2}'` if [ -n "$res" ]; then diff --git a/dbswitch-product/dbswitch-product-clickhouse/pom.xml b/dbswitch-product/dbswitch-product-clickhouse/pom.xml index ee68a3f4..ec89e534 100644 --- a/dbswitch-product/dbswitch-product-clickhouse/pom.xml +++ b/dbswitch-product/dbswitch-product-clickhouse/pom.xml @@ -5,7 +5,7 @@ dbswitch-product com.gitee.dbswitch - 1.8.2 + 1.9.0 4.0.0 diff --git a/dbswitch-product/dbswitch-product-clickhouse/src/main/java/com/gitee/dbswitch/product/clickhouse/ClickhouseFactoryProvider.java b/dbswitch-product/dbswitch-product-clickhouse/src/main/java/com/gitee/dbswitch/product/clickhouse/ClickhouseFactoryProvider.java index 0668e8b3..2a2f78d3 100644 --- a/dbswitch-product/dbswitch-product-clickhouse/src/main/java/com/gitee/dbswitch/product/clickhouse/ClickhouseFactoryProvider.java +++ b/dbswitch-product/dbswitch-product-clickhouse/src/main/java/com/gitee/dbswitch/product/clickhouse/ClickhouseFactoryProvider.java @@ -14,10 +14,10 @@ import com.gitee.dbswitch.common.type.ProductTypeEnum; import com.gitee.dbswitch.features.ProductFeatures; import com.gitee.dbswitch.provider.AbstractFactoryProvider; import com.gitee.dbswitch.provider.meta.MetadataProvider; -import com.gitee.dbswitch.provider.operate.DefaultTableOperateProvider; -import com.gitee.dbswitch.provider.operate.TableOperateProvider; -import com.gitee.dbswitch.provider.sync.AutoCastTableDataSynchronizer; -import com.gitee.dbswitch.provider.sync.TableDataSynchronizer; +import com.gitee.dbswitch.provider.manage.DefaultTableManageProvider; +import com.gitee.dbswitch.provider.manage.TableManageProvider; +import com.gitee.dbswitch.provider.sync.AutoCastTableDataSynchronizeProvider; +import com.gitee.dbswitch.provider.sync.TableDataSynchronizeProvider; import com.gitee.dbswitch.provider.write.AutoCastTableDataWriteProvider; import com.gitee.dbswitch.provider.write.TableDataWriteProvider; import javax.sql.DataSource; @@ -44,13 +44,13 @@ public class ClickhouseFactoryProvider extends AbstractFactoryProvider { } @Override - public TableOperateProvider createTableOperateProvider() { - return new DefaultTableOperateProvider(this); + public TableManageProvider createTableManageProvider() { + return new DefaultTableManageProvider(this); } @Override - public TableDataSynchronizer createTableDataSynchronizer() { - return new AutoCastTableDataSynchronizer(this); + public TableDataSynchronizeProvider createTableDataSynchronizeProvider() { + return new AutoCastTableDataSynchronizeProvider(this); } } diff --git a/dbswitch-product/dbswitch-product-db2/pom.xml b/dbswitch-product/dbswitch-product-db2/pom.xml index 7301e4ab..c89ff436 100644 --- a/dbswitch-product/dbswitch-product-db2/pom.xml +++ b/dbswitch-product/dbswitch-product-db2/pom.xml @@ -5,7 +5,7 @@ dbswitch-product com.gitee.dbswitch - 1.8.2 + 1.9.0 4.0.0 diff --git a/dbswitch-product/dbswitch-product-db2/src/main/java/com/gitee/dbswitch/product/db2/DB2FactoryProvider.java b/dbswitch-product/dbswitch-product-db2/src/main/java/com/gitee/dbswitch/product/db2/DB2FactoryProvider.java index c53f103e..701689e8 100644 --- a/dbswitch-product/dbswitch-product-db2/src/main/java/com/gitee/dbswitch/product/db2/DB2FactoryProvider.java +++ b/dbswitch-product/dbswitch-product-db2/src/main/java/com/gitee/dbswitch/product/db2/DB2FactoryProvider.java @@ -14,9 +14,9 @@ import com.gitee.dbswitch.common.type.ProductTypeEnum; import com.gitee.dbswitch.features.ProductFeatures; import com.gitee.dbswitch.provider.AbstractFactoryProvider; import com.gitee.dbswitch.provider.meta.MetadataProvider; -import com.gitee.dbswitch.provider.operate.TableOperateProvider; -import com.gitee.dbswitch.provider.sync.AutoCastTableDataSynchronizer; -import com.gitee.dbswitch.provider.sync.TableDataSynchronizer; +import com.gitee.dbswitch.provider.manage.TableManageProvider; +import com.gitee.dbswitch.provider.sync.AutoCastTableDataSynchronizeProvider; +import com.gitee.dbswitch.provider.sync.TableDataSynchronizeProvider; import com.gitee.dbswitch.provider.write.AutoCastTableDataWriteProvider; import com.gitee.dbswitch.provider.write.TableDataWriteProvider; import javax.sql.DataSource; @@ -43,13 +43,13 @@ public class DB2FactoryProvider extends AbstractFactoryProvider { } @Override - public TableOperateProvider createTableOperateProvider() { - return new DB2TableOperateProvider(this); + public TableManageProvider createTableManageProvider() { + return new DB2TableManageProvider(this); } @Override - public TableDataSynchronizer createTableDataSynchronizer() { - return new AutoCastTableDataSynchronizer(this); + public TableDataSynchronizeProvider createTableDataSynchronizeProvider() { + return new AutoCastTableDataSynchronizeProvider(this); } } diff --git a/dbswitch-product/dbswitch-product-db2/src/main/java/com/gitee/dbswitch/product/db2/DB2TableOperateProvider.java b/dbswitch-product/dbswitch-product-db2/src/main/java/com/gitee/dbswitch/product/db2/DB2TableManageProvider.java similarity index 74% rename from dbswitch-product/dbswitch-product-db2/src/main/java/com/gitee/dbswitch/product/db2/DB2TableOperateProvider.java rename to dbswitch-product/dbswitch-product-db2/src/main/java/com/gitee/dbswitch/product/db2/DB2TableManageProvider.java index 883d760b..873bfe1e 100644 --- a/dbswitch-product/dbswitch-product-db2/src/main/java/com/gitee/dbswitch/product/db2/DB2TableOperateProvider.java +++ b/dbswitch-product/dbswitch-product-db2/src/main/java/com/gitee/dbswitch/product/db2/DB2TableManageProvider.java @@ -10,11 +10,11 @@ package com.gitee.dbswitch.product.db2; import com.gitee.dbswitch.provider.ProductFactoryProvider; -import com.gitee.dbswitch.provider.operate.DefaultTableOperateProvider; +import com.gitee.dbswitch.provider.manage.DefaultTableManageProvider; -public class DB2TableOperateProvider extends DefaultTableOperateProvider { +public class DB2TableManageProvider extends DefaultTableManageProvider { - public DB2TableOperateProvider(ProductFactoryProvider factoryProvider) { + public DB2TableManageProvider(ProductFactoryProvider factoryProvider) { super(factoryProvider); } diff --git a/dbswitch-product/dbswitch-product-dm/pom.xml b/dbswitch-product/dbswitch-product-dm/pom.xml index 3bf35752..567d9e1d 100644 --- a/dbswitch-product/dbswitch-product-dm/pom.xml +++ b/dbswitch-product/dbswitch-product-dm/pom.xml @@ -5,7 +5,7 @@ dbswitch-product com.gitee.dbswitch - 1.8.2 + 1.9.0 4.0.0 dbswitch-product-dm diff --git a/dbswitch-product/dbswitch-product-dm/src/main/java/com/gitee/dbswitch/product/dm/DmFactoryProvider.java b/dbswitch-product/dbswitch-product-dm/src/main/java/com/gitee/dbswitch/product/dm/DmFactoryProvider.java index 84863b3d..0ff4d3b7 100644 --- a/dbswitch-product/dbswitch-product-dm/src/main/java/com/gitee/dbswitch/product/dm/DmFactoryProvider.java +++ b/dbswitch-product/dbswitch-product-dm/src/main/java/com/gitee/dbswitch/product/dm/DmFactoryProvider.java @@ -12,12 +12,12 @@ package com.gitee.dbswitch.product.dm; import com.gitee.dbswitch.annotation.Product; import com.gitee.dbswitch.common.type.ProductTypeEnum; import com.gitee.dbswitch.features.ProductFeatures; -import com.gitee.dbswitch.product.oracle.OracleTableOperateProvider; +import com.gitee.dbswitch.product.oracle.OracleTableManageProvider; import com.gitee.dbswitch.provider.AbstractFactoryProvider; import com.gitee.dbswitch.provider.meta.MetadataProvider; -import com.gitee.dbswitch.provider.operate.TableOperateProvider; -import com.gitee.dbswitch.provider.sync.AutoCastTableDataSynchronizer; -import com.gitee.dbswitch.provider.sync.TableDataSynchronizer; +import com.gitee.dbswitch.provider.manage.TableManageProvider; +import com.gitee.dbswitch.provider.sync.AutoCastTableDataSynchronizeProvider; +import com.gitee.dbswitch.provider.sync.TableDataSynchronizeProvider; import com.gitee.dbswitch.provider.write.TableDataWriteProvider; import javax.sql.DataSource; @@ -43,13 +43,13 @@ public class DmFactoryProvider extends AbstractFactoryProvider { } @Override - public TableOperateProvider createTableOperateProvider() { - return new OracleTableOperateProvider(this); + public TableManageProvider createTableManageProvider() { + return new OracleTableManageProvider(this); } @Override - public TableDataSynchronizer createTableDataSynchronizer() { - return new AutoCastTableDataSynchronizer(this); + public TableDataSynchronizeProvider createTableDataSynchronizeProvider() { + return new AutoCastTableDataSynchronizeProvider(this); } } diff --git a/dbswitch-product/dbswitch-product-gbase/pom.xml b/dbswitch-product/dbswitch-product-gbase/pom.xml index 98fb28fa..d603de8d 100644 --- a/dbswitch-product/dbswitch-product-gbase/pom.xml +++ b/dbswitch-product/dbswitch-product-gbase/pom.xml @@ -5,7 +5,7 @@ dbswitch-product com.gitee.dbswitch - 1.8.2 + 1.9.0 4.0.0 diff --git a/dbswitch-product/dbswitch-product-gbase/src/main/java/com/gitee/dbswitch/product/gbase/GbaseFactoryProvider.java b/dbswitch-product/dbswitch-product-gbase/src/main/java/com/gitee/dbswitch/product/gbase/GbaseFactoryProvider.java index ab561464..07d219b1 100644 --- a/dbswitch-product/dbswitch-product-gbase/src/main/java/com/gitee/dbswitch/product/gbase/GbaseFactoryProvider.java +++ b/dbswitch-product/dbswitch-product-gbase/src/main/java/com/gitee/dbswitch/product/gbase/GbaseFactoryProvider.java @@ -15,8 +15,8 @@ import com.gitee.dbswitch.features.ProductFeatures; import com.gitee.dbswitch.product.mysql.MysqlMetadataQueryProvider; import com.gitee.dbswitch.provider.AbstractFactoryProvider; import com.gitee.dbswitch.provider.meta.MetadataProvider; -import com.gitee.dbswitch.provider.sync.AutoCastTableDataSynchronizer; -import com.gitee.dbswitch.provider.sync.TableDataSynchronizer; +import com.gitee.dbswitch.provider.sync.AutoCastTableDataSynchronizeProvider; +import com.gitee.dbswitch.provider.sync.TableDataSynchronizeProvider; import com.gitee.dbswitch.provider.write.AutoCastTableDataWriteProvider; import com.gitee.dbswitch.provider.write.TableDataWriteProvider; import javax.sql.DataSource; @@ -43,8 +43,8 @@ public class GbaseFactoryProvider extends AbstractFactoryProvider { } @Override - public TableDataSynchronizer createTableDataSynchronizer() { - return new AutoCastTableDataSynchronizer(this); + public TableDataSynchronizeProvider createTableDataSynchronizeProvider() { + return new AutoCastTableDataSynchronizeProvider(this); } } diff --git a/dbswitch-product/dbswitch-product-hive/pom.xml b/dbswitch-product/dbswitch-product-hive/pom.xml index c41185ac..ef9a4f03 100644 --- a/dbswitch-product/dbswitch-product-hive/pom.xml +++ b/dbswitch-product/dbswitch-product-hive/pom.xml @@ -5,7 +5,7 @@ dbswitch-product com.gitee.dbswitch - 1.8.2 + 1.9.0 4.0.0 diff --git a/dbswitch-product/dbswitch-product-kingbase/pom.xml b/dbswitch-product/dbswitch-product-kingbase/pom.xml index 157cda9f..f1fee599 100644 --- a/dbswitch-product/dbswitch-product-kingbase/pom.xml +++ b/dbswitch-product/dbswitch-product-kingbase/pom.xml @@ -5,7 +5,7 @@ dbswitch-product com.gitee.dbswitch - 1.8.2 + 1.9.0 4.0.0 diff --git a/dbswitch-product/dbswitch-product-kingbase/src/main/java/com/gitee/dbswitch/product/kingbase/KingbaseFactoryProvider.java b/dbswitch-product/dbswitch-product-kingbase/src/main/java/com/gitee/dbswitch/product/kingbase/KingbaseFactoryProvider.java index d4b7d028..139b4748 100644 --- a/dbswitch-product/dbswitch-product-kingbase/src/main/java/com/gitee/dbswitch/product/kingbase/KingbaseFactoryProvider.java +++ b/dbswitch-product/dbswitch-product-kingbase/src/main/java/com/gitee/dbswitch/product/kingbase/KingbaseFactoryProvider.java @@ -12,12 +12,12 @@ package com.gitee.dbswitch.product.kingbase; import com.gitee.dbswitch.annotation.Product; import com.gitee.dbswitch.common.type.ProductTypeEnum; import com.gitee.dbswitch.features.ProductFeatures; -import com.gitee.dbswitch.product.postgresql.PostgresTableOperateProvider; +import com.gitee.dbswitch.product.postgresql.PostgresTableManageProvider; import com.gitee.dbswitch.provider.AbstractFactoryProvider; import com.gitee.dbswitch.provider.meta.MetadataProvider; -import com.gitee.dbswitch.provider.operate.TableOperateProvider; -import com.gitee.dbswitch.provider.sync.AutoCastTableDataSynchronizer; -import com.gitee.dbswitch.provider.sync.TableDataSynchronizer; +import com.gitee.dbswitch.provider.manage.TableManageProvider; +import com.gitee.dbswitch.provider.sync.AutoCastTableDataSynchronizeProvider; +import com.gitee.dbswitch.provider.sync.TableDataSynchronizeProvider; import com.gitee.dbswitch.provider.write.AutoCastTableDataWriteProvider; import com.gitee.dbswitch.provider.write.TableDataWriteProvider; import javax.sql.DataSource; @@ -39,8 +39,8 @@ public class KingbaseFactoryProvider extends AbstractFactoryProvider { } @Override - public TableOperateProvider createTableOperateProvider() { - return new PostgresTableOperateProvider(this); + public TableManageProvider createTableManageProvider() { + return new PostgresTableManageProvider(this); } @Override @@ -49,7 +49,7 @@ public class KingbaseFactoryProvider extends AbstractFactoryProvider { } @Override - public TableDataSynchronizer createTableDataSynchronizer() { - return new AutoCastTableDataSynchronizer(this); + public TableDataSynchronizeProvider createTableDataSynchronizeProvider() { + return new AutoCastTableDataSynchronizeProvider(this); } } diff --git a/dbswitch-product/dbswitch-product-mariadb/pom.xml b/dbswitch-product/dbswitch-product-mariadb/pom.xml index d5dbb384..9ce8a739 100644 --- a/dbswitch-product/dbswitch-product-mariadb/pom.xml +++ b/dbswitch-product/dbswitch-product-mariadb/pom.xml @@ -5,7 +5,7 @@ dbswitch-product com.gitee.dbswitch - 1.8.2 + 1.9.0 4.0.0 diff --git a/dbswitch-product/dbswitch-product-mariadb/src/main/java/com/gitee/dbswitch/product/mariadb/MariadbFactoryProvider.java b/dbswitch-product/dbswitch-product-mariadb/src/main/java/com/gitee/dbswitch/product/mariadb/MariadbFactoryProvider.java index 01c7a436..3d8ee2ff 100644 --- a/dbswitch-product/dbswitch-product-mariadb/src/main/java/com/gitee/dbswitch/product/mariadb/MariadbFactoryProvider.java +++ b/dbswitch-product/dbswitch-product-mariadb/src/main/java/com/gitee/dbswitch/product/mariadb/MariadbFactoryProvider.java @@ -15,8 +15,8 @@ import com.gitee.dbswitch.features.ProductFeatures; import com.gitee.dbswitch.product.mysql.MysqlMetadataQueryProvider; import com.gitee.dbswitch.provider.AbstractFactoryProvider; import com.gitee.dbswitch.provider.meta.MetadataProvider; -import com.gitee.dbswitch.provider.sync.AutoCastTableDataSynchronizer; -import com.gitee.dbswitch.provider.sync.TableDataSynchronizer; +import com.gitee.dbswitch.provider.sync.AutoCastTableDataSynchronizeProvider; +import com.gitee.dbswitch.provider.sync.TableDataSynchronizeProvider; import com.gitee.dbswitch.provider.write.AutoCastTableDataWriteProvider; import com.gitee.dbswitch.provider.write.TableDataWriteProvider; import javax.sql.DataSource; @@ -43,8 +43,8 @@ public class MariadbFactoryProvider extends AbstractFactoryProvider { } @Override - public TableDataSynchronizer createTableDataSynchronizer() { - return new AutoCastTableDataSynchronizer(this); + public TableDataSynchronizeProvider createTableDataSynchronizeProvider() { + return new AutoCastTableDataSynchronizeProvider(this); } } diff --git a/dbswitch-product/dbswitch-product-mongodb/pom.xml b/dbswitch-product/dbswitch-product-mongodb/pom.xml index 256a13c2..767dc884 100644 --- a/dbswitch-product/dbswitch-product-mongodb/pom.xml +++ b/dbswitch-product/dbswitch-product-mongodb/pom.xml @@ -5,7 +5,7 @@ dbswitch-product com.gitee.dbswitch - 1.8.2 + 1.9.0 4.0.0 dbswitch-product-mongodb diff --git a/dbswitch-product/dbswitch-product-mongodb/src/main/java/com/gitee/dbswitch/product/mongodb/MongodbFactoryProvider.java b/dbswitch-product/dbswitch-product-mongodb/src/main/java/com/gitee/dbswitch/product/mongodb/MongodbFactoryProvider.java index 64c9e905..d9fe3a99 100644 --- a/dbswitch-product/dbswitch-product-mongodb/src/main/java/com/gitee/dbswitch/product/mongodb/MongodbFactoryProvider.java +++ b/dbswitch-product/dbswitch-product-mongodb/src/main/java/com/gitee/dbswitch/product/mongodb/MongodbFactoryProvider.java @@ -14,9 +14,9 @@ import com.gitee.dbswitch.common.type.ProductTypeEnum; import com.gitee.dbswitch.features.ProductFeatures; import com.gitee.dbswitch.provider.AbstractFactoryProvider; import com.gitee.dbswitch.provider.meta.MetadataProvider; -import com.gitee.dbswitch.provider.operate.TableOperateProvider; +import com.gitee.dbswitch.provider.manage.TableManageProvider; import com.gitee.dbswitch.provider.query.TableDataQueryProvider; -import com.gitee.dbswitch.provider.sync.TableDataSynchronizer; +import com.gitee.dbswitch.provider.sync.TableDataSynchronizeProvider; import com.gitee.dbswitch.provider.write.TableDataWriteProvider; import javax.sql.DataSource; @@ -47,12 +47,12 @@ public class MongodbFactoryProvider extends AbstractFactoryProvider { } @Override - public TableOperateProvider createTableOperateProvider() { - return new MongodbTableOperateProvider(this); + public TableManageProvider createTableManageProvider() { + return new MongodbTableManageProvider(this); } @Override - public TableDataSynchronizer createTableDataSynchronizer() { + public TableDataSynchronizeProvider createTableDataSynchronizeProvider() { return new MongodbTableDataSynchronizer(this); } diff --git a/dbswitch-product/dbswitch-product-mongodb/src/main/java/com/gitee/dbswitch/product/mongodb/MongodbTableDataSynchronizer.java b/dbswitch-product/dbswitch-product-mongodb/src/main/java/com/gitee/dbswitch/product/mongodb/MongodbTableDataSynchronizer.java index 8ce670c9..d9bdb0b9 100644 --- a/dbswitch-product/dbswitch-product-mongodb/src/main/java/com/gitee/dbswitch/product/mongodb/MongodbTableDataSynchronizer.java +++ b/dbswitch-product/dbswitch-product-mongodb/src/main/java/com/gitee/dbswitch/product/mongodb/MongodbTableDataSynchronizer.java @@ -10,10 +10,10 @@ package com.gitee.dbswitch.product.mongodb; import com.gitee.dbswitch.provider.ProductFactoryProvider; -import com.gitee.dbswitch.provider.sync.DefaultTableDataSynchronizer; +import com.gitee.dbswitch.provider.sync.DefaultTableDataSynchronizeProvider; import java.util.List; -public class MongodbTableDataSynchronizer extends DefaultTableDataSynchronizer { +public class MongodbTableDataSynchronizer extends DefaultTableDataSynchronizeProvider { public MongodbTableDataSynchronizer(ProductFactoryProvider factoryProvider) { super(factoryProvider); diff --git a/dbswitch-product/dbswitch-product-mongodb/src/main/java/com/gitee/dbswitch/product/mongodb/MongodbTableOperateProvider.java b/dbswitch-product/dbswitch-product-mongodb/src/main/java/com/gitee/dbswitch/product/mongodb/MongodbTableManageProvider.java similarity index 78% rename from dbswitch-product/dbswitch-product-mongodb/src/main/java/com/gitee/dbswitch/product/mongodb/MongodbTableOperateProvider.java rename to dbswitch-product/dbswitch-product-mongodb/src/main/java/com/gitee/dbswitch/product/mongodb/MongodbTableManageProvider.java index 923a9f80..b6ad21e3 100644 --- a/dbswitch-product/dbswitch-product-mongodb/src/main/java/com/gitee/dbswitch/product/mongodb/MongodbTableOperateProvider.java +++ b/dbswitch-product/dbswitch-product-mongodb/src/main/java/com/gitee/dbswitch/product/mongodb/MongodbTableManageProvider.java @@ -10,11 +10,11 @@ package com.gitee.dbswitch.product.mongodb; import com.gitee.dbswitch.provider.ProductFactoryProvider; -import com.gitee.dbswitch.provider.operate.DefaultTableOperateProvider; +import com.gitee.dbswitch.provider.manage.DefaultTableManageProvider; -public class MongodbTableOperateProvider extends DefaultTableOperateProvider { +public class MongodbTableManageProvider extends DefaultTableManageProvider { - public MongodbTableOperateProvider(ProductFactoryProvider factoryProvider) { + public MongodbTableManageProvider(ProductFactoryProvider factoryProvider) { super(factoryProvider); } diff --git a/dbswitch-product/dbswitch-product-mysql/pom.xml b/dbswitch-product/dbswitch-product-mysql/pom.xml index 8adaf31d..58f2f26b 100644 --- a/dbswitch-product/dbswitch-product-mysql/pom.xml +++ b/dbswitch-product/dbswitch-product-mysql/pom.xml @@ -5,7 +5,7 @@ dbswitch-product com.gitee.dbswitch - 1.8.2 + 1.9.0 4.0.0 dbswitch-product-mysql diff --git a/dbswitch-product/dbswitch-product-mysql/src/main/java/com/gitee/dbswitch/product/mysql/MysqlFactoryProvider.java b/dbswitch-product/dbswitch-product-mysql/src/main/java/com/gitee/dbswitch/product/mysql/MysqlFactoryProvider.java index 224d22d8..ee9068a2 100644 --- a/dbswitch-product/dbswitch-product-mysql/src/main/java/com/gitee/dbswitch/product/mysql/MysqlFactoryProvider.java +++ b/dbswitch-product/dbswitch-product-mysql/src/main/java/com/gitee/dbswitch/product/mysql/MysqlFactoryProvider.java @@ -14,8 +14,8 @@ import com.gitee.dbswitch.common.type.ProductTypeEnum; import com.gitee.dbswitch.features.ProductFeatures; import com.gitee.dbswitch.provider.AbstractFactoryProvider; import com.gitee.dbswitch.provider.meta.MetadataProvider; -import com.gitee.dbswitch.provider.sync.AutoCastTableDataSynchronizer; -import com.gitee.dbswitch.provider.sync.TableDataSynchronizer; +import com.gitee.dbswitch.provider.sync.AutoCastTableDataSynchronizeProvider; +import com.gitee.dbswitch.provider.sync.TableDataSynchronizeProvider; import com.gitee.dbswitch.provider.write.AutoCastTableDataWriteProvider; import com.gitee.dbswitch.provider.write.TableDataWriteProvider; import javax.sql.DataSource; @@ -42,8 +42,8 @@ public class MysqlFactoryProvider extends AbstractFactoryProvider { } @Override - public TableDataSynchronizer createTableDataSynchronizer() { - return new AutoCastTableDataSynchronizer(this); + public TableDataSynchronizeProvider createTableDataSynchronizeProvider() { + return new AutoCastTableDataSynchronizeProvider(this); } } diff --git a/dbswitch-product/dbswitch-product-openguass/pom.xml b/dbswitch-product/dbswitch-product-openguass/pom.xml index 3e20628b..891a6ccf 100644 --- a/dbswitch-product/dbswitch-product-openguass/pom.xml +++ b/dbswitch-product/dbswitch-product-openguass/pom.xml @@ -5,7 +5,7 @@ dbswitch-product com.gitee.dbswitch - 1.8.2 + 1.9.0 4.0.0 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 c83fa932..f9c454a2 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 @@ -14,9 +14,9 @@ import com.gitee.dbswitch.common.type.ProductTypeEnum; import com.gitee.dbswitch.features.ProductFeatures; import com.gitee.dbswitch.provider.AbstractFactoryProvider; import com.gitee.dbswitch.provider.meta.MetadataProvider; -import com.gitee.dbswitch.provider.operate.TableOperateProvider; -import com.gitee.dbswitch.provider.sync.AutoCastTableDataSynchronizer; -import com.gitee.dbswitch.provider.sync.TableDataSynchronizer; +import com.gitee.dbswitch.provider.manage.TableManageProvider; +import com.gitee.dbswitch.provider.sync.AutoCastTableDataSynchronizeProvider; +import com.gitee.dbswitch.provider.sync.TableDataSynchronizeProvider; import com.gitee.dbswitch.provider.write.AutoCastTableDataWriteProvider; import com.gitee.dbswitch.provider.write.TableDataWriteProvider; import javax.sql.DataSource; @@ -39,8 +39,8 @@ public class OpenGaussFactoryProvider extends AbstractFactoryProvider { } @Override - public TableOperateProvider createTableOperateProvider() { - return new OpenGaussTableOperateProvider(this); + public TableManageProvider createTableManageProvider() { + return new OpenGaussTableManageProvider(this); } @Override @@ -49,7 +49,7 @@ public class OpenGaussFactoryProvider extends AbstractFactoryProvider { } @Override - public TableDataSynchronizer createTableDataSynchronizer() { - return new AutoCastTableDataSynchronizer(this); + public TableDataSynchronizeProvider createTableDataSynchronizeProvider() { + return new AutoCastTableDataSynchronizeProvider(this); } } diff --git a/dbswitch-product/dbswitch-product-openguass/src/main/java/com/gitee/dbswitch/product/openguass/OpenGaussTableOperateProvider.java b/dbswitch-product/dbswitch-product-openguass/src/main/java/com/gitee/dbswitch/product/openguass/OpenGaussTableManageProvider.java similarity index 73% rename from dbswitch-product/dbswitch-product-openguass/src/main/java/com/gitee/dbswitch/product/openguass/OpenGaussTableOperateProvider.java rename to dbswitch-product/dbswitch-product-openguass/src/main/java/com/gitee/dbswitch/product/openguass/OpenGaussTableManageProvider.java index a7ecb898..49bf74c9 100644 --- a/dbswitch-product/dbswitch-product-openguass/src/main/java/com/gitee/dbswitch/product/openguass/OpenGaussTableOperateProvider.java +++ b/dbswitch-product/dbswitch-product-openguass/src/main/java/com/gitee/dbswitch/product/openguass/OpenGaussTableManageProvider.java @@ -10,11 +10,11 @@ package com.gitee.dbswitch.product.openguass; import com.gitee.dbswitch.provider.ProductFactoryProvider; -import com.gitee.dbswitch.provider.operate.DefaultTableOperateProvider; +import com.gitee.dbswitch.provider.manage.DefaultTableManageProvider; -public class OpenGaussTableOperateProvider extends DefaultTableOperateProvider { +public class OpenGaussTableManageProvider extends DefaultTableManageProvider { - public OpenGaussTableOperateProvider(ProductFactoryProvider factoryProvider) { + public OpenGaussTableManageProvider(ProductFactoryProvider factoryProvider) { super(factoryProvider); } diff --git a/dbswitch-product/dbswitch-product-oracle/pom.xml b/dbswitch-product/dbswitch-product-oracle/pom.xml index 251b10bb..cbf7c5b7 100644 --- a/dbswitch-product/dbswitch-product-oracle/pom.xml +++ b/dbswitch-product/dbswitch-product-oracle/pom.xml @@ -5,7 +5,7 @@ dbswitch-product com.gitee.dbswitch - 1.8.2 + 1.9.0 4.0.0 diff --git a/dbswitch-product/dbswitch-product-oracle/src/main/java/com/gitee/dbswitch/product/oracle/OracleFactoryProvider.java b/dbswitch-product/dbswitch-product-oracle/src/main/java/com/gitee/dbswitch/product/oracle/OracleFactoryProvider.java index ceeac3e4..819a7075 100644 --- a/dbswitch-product/dbswitch-product-oracle/src/main/java/com/gitee/dbswitch/product/oracle/OracleFactoryProvider.java +++ b/dbswitch-product/dbswitch-product-oracle/src/main/java/com/gitee/dbswitch/product/oracle/OracleFactoryProvider.java @@ -14,8 +14,8 @@ import com.gitee.dbswitch.common.type.ProductTypeEnum; import com.gitee.dbswitch.features.ProductFeatures; import com.gitee.dbswitch.provider.AbstractFactoryProvider; import com.gitee.dbswitch.provider.meta.MetadataProvider; -import com.gitee.dbswitch.provider.operate.TableOperateProvider; -import com.gitee.dbswitch.provider.sync.TableDataSynchronizer; +import com.gitee.dbswitch.provider.manage.TableManageProvider; +import com.gitee.dbswitch.provider.sync.TableDataSynchronizeProvider; import com.gitee.dbswitch.provider.write.TableDataWriteProvider; import javax.sql.DataSource; @@ -41,12 +41,12 @@ public class OracleFactoryProvider extends AbstractFactoryProvider { } @Override - public TableOperateProvider createTableOperateProvider() { - return new OracleTableOperateProvider(this); + public TableManageProvider createTableManageProvider() { + return new OracleTableManageProvider(this); } @Override - public TableDataSynchronizer createTableDataSynchronizer() { + public TableDataSynchronizeProvider createTableDataSynchronizeProvider() { return new OracleTableDataSynchronizer(this); } diff --git a/dbswitch-product/dbswitch-product-oracle/src/main/java/com/gitee/dbswitch/product/oracle/OracleTableDataSynchronizer.java b/dbswitch-product/dbswitch-product-oracle/src/main/java/com/gitee/dbswitch/product/oracle/OracleTableDataSynchronizer.java index d9b191a1..8076e28f 100644 --- a/dbswitch-product/dbswitch-product-oracle/src/main/java/com/gitee/dbswitch/product/oracle/OracleTableDataSynchronizer.java +++ b/dbswitch-product/dbswitch-product-oracle/src/main/java/com/gitee/dbswitch/product/oracle/OracleTableDataSynchronizer.java @@ -10,12 +10,12 @@ package com.gitee.dbswitch.product.oracle; import com.gitee.dbswitch.provider.ProductFactoryProvider; -import com.gitee.dbswitch.provider.sync.DefaultTableDataSynchronizer; +import com.gitee.dbswitch.provider.sync.DefaultTableDataSynchronizeProvider; import java.io.InputStream; import java.util.ArrayList; import java.util.List; -public class OracleTableDataSynchronizer extends DefaultTableDataSynchronizer { +public class OracleTableDataSynchronizer extends DefaultTableDataSynchronizeProvider { public OracleTableDataSynchronizer(ProductFactoryProvider factoryProvider) { super(factoryProvider); diff --git a/dbswitch-product/dbswitch-product-oracle/src/main/java/com/gitee/dbswitch/product/oracle/OracleTableOperateProvider.java b/dbswitch-product/dbswitch-product-oracle/src/main/java/com/gitee/dbswitch/product/oracle/OracleTableManageProvider.java similarity index 73% rename from dbswitch-product/dbswitch-product-oracle/src/main/java/com/gitee/dbswitch/product/oracle/OracleTableOperateProvider.java rename to dbswitch-product/dbswitch-product-oracle/src/main/java/com/gitee/dbswitch/product/oracle/OracleTableManageProvider.java index 9827c96e..da401322 100644 --- a/dbswitch-product/dbswitch-product-oracle/src/main/java/com/gitee/dbswitch/product/oracle/OracleTableOperateProvider.java +++ b/dbswitch-product/dbswitch-product-oracle/src/main/java/com/gitee/dbswitch/product/oracle/OracleTableManageProvider.java @@ -10,11 +10,11 @@ package com.gitee.dbswitch.product.oracle; import com.gitee.dbswitch.provider.ProductFactoryProvider; -import com.gitee.dbswitch.provider.operate.DefaultTableOperateProvider; +import com.gitee.dbswitch.provider.manage.DefaultTableManageProvider; -public class OracleTableOperateProvider extends DefaultTableOperateProvider { +public class OracleTableManageProvider extends DefaultTableManageProvider { - public OracleTableOperateProvider(ProductFactoryProvider factoryProvider) { + public OracleTableManageProvider(ProductFactoryProvider factoryProvider) { super(factoryProvider); } diff --git a/dbswitch-product/dbswitch-product-oscar/pom.xml b/dbswitch-product/dbswitch-product-oscar/pom.xml index f3945e81..85306965 100644 --- a/dbswitch-product/dbswitch-product-oscar/pom.xml +++ b/dbswitch-product/dbswitch-product-oscar/pom.xml @@ -5,7 +5,7 @@ dbswitch-product com.gitee.dbswitch - 1.8.2 + 1.9.0 4.0.0 diff --git a/dbswitch-product/dbswitch-product-oscar/src/main/java/com/gitee/dbswitch/product/oscar/OscarFactoryProvider.java b/dbswitch-product/dbswitch-product-oscar/src/main/java/com/gitee/dbswitch/product/oscar/OscarFactoryProvider.java index fa23b25a..6ad177e2 100644 --- a/dbswitch-product/dbswitch-product-oscar/src/main/java/com/gitee/dbswitch/product/oscar/OscarFactoryProvider.java +++ b/dbswitch-product/dbswitch-product-oscar/src/main/java/com/gitee/dbswitch/product/oscar/OscarFactoryProvider.java @@ -14,9 +14,9 @@ import com.gitee.dbswitch.common.type.ProductTypeEnum; import com.gitee.dbswitch.features.ProductFeatures; import com.gitee.dbswitch.provider.AbstractFactoryProvider; import com.gitee.dbswitch.provider.meta.MetadataProvider; -import com.gitee.dbswitch.provider.operate.TableOperateProvider; -import com.gitee.dbswitch.provider.sync.AutoCastTableDataSynchronizer; -import com.gitee.dbswitch.provider.sync.TableDataSynchronizer; +import com.gitee.dbswitch.provider.manage.TableManageProvider; +import com.gitee.dbswitch.provider.sync.AutoCastTableDataSynchronizeProvider; +import com.gitee.dbswitch.provider.sync.TableDataSynchronizeProvider; import com.gitee.dbswitch.provider.write.AutoCastTableDataWriteProvider; import com.gitee.dbswitch.provider.write.TableDataWriteProvider; import javax.sql.DataSource; @@ -43,13 +43,13 @@ public class OscarFactoryProvider extends AbstractFactoryProvider { } @Override - public TableOperateProvider createTableOperateProvider() { - return new OscarTableOperateProvider(this); + public TableManageProvider createTableManageProvider() { + return new OscarTableManageProvider(this); } @Override - public TableDataSynchronizer createTableDataSynchronizer() { - return new AutoCastTableDataSynchronizer(this); + public TableDataSynchronizeProvider createTableDataSynchronizeProvider() { + return new AutoCastTableDataSynchronizeProvider(this); } } diff --git a/dbswitch-product/dbswitch-product-oscar/src/main/java/com/gitee/dbswitch/product/oscar/OscarTableOperateProvider.java b/dbswitch-product/dbswitch-product-oscar/src/main/java/com/gitee/dbswitch/product/oscar/OscarTableManageProvider.java similarity index 73% rename from dbswitch-product/dbswitch-product-oscar/src/main/java/com/gitee/dbswitch/product/oscar/OscarTableOperateProvider.java rename to dbswitch-product/dbswitch-product-oscar/src/main/java/com/gitee/dbswitch/product/oscar/OscarTableManageProvider.java index ecc59013..0e93bced 100644 --- a/dbswitch-product/dbswitch-product-oscar/src/main/java/com/gitee/dbswitch/product/oscar/OscarTableOperateProvider.java +++ b/dbswitch-product/dbswitch-product-oscar/src/main/java/com/gitee/dbswitch/product/oscar/OscarTableManageProvider.java @@ -10,11 +10,11 @@ package com.gitee.dbswitch.product.oscar; import com.gitee.dbswitch.provider.ProductFactoryProvider; -import com.gitee.dbswitch.provider.operate.DefaultTableOperateProvider; +import com.gitee.dbswitch.provider.manage.DefaultTableManageProvider; -public class OscarTableOperateProvider extends DefaultTableOperateProvider { +public class OscarTableManageProvider extends DefaultTableManageProvider { - public OscarTableOperateProvider(ProductFactoryProvider factoryProvider) { + public OscarTableManageProvider(ProductFactoryProvider factoryProvider) { super(factoryProvider); } diff --git a/dbswitch-product/dbswitch-product-postgresql/pom.xml b/dbswitch-product/dbswitch-product-postgresql/pom.xml index c6d6adee..68e8d0ff 100644 --- a/dbswitch-product/dbswitch-product-postgresql/pom.xml +++ b/dbswitch-product/dbswitch-product-postgresql/pom.xml @@ -5,7 +5,7 @@ dbswitch-product com.gitee.dbswitch - 1.8.2 + 1.9.0 4.0.0 diff --git a/dbswitch-product/dbswitch-product-postgresql/src/main/java/com/gitee/dbswitch/product/postgresql/PostgresFactoryProvider.java b/dbswitch-product/dbswitch-product-postgresql/src/main/java/com/gitee/dbswitch/product/postgresql/PostgresFactoryProvider.java index f9a94304..3dd6c579 100644 --- a/dbswitch-product/dbswitch-product-postgresql/src/main/java/com/gitee/dbswitch/product/postgresql/PostgresFactoryProvider.java +++ b/dbswitch-product/dbswitch-product-postgresql/src/main/java/com/gitee/dbswitch/product/postgresql/PostgresFactoryProvider.java @@ -14,9 +14,9 @@ import com.gitee.dbswitch.common.type.ProductTypeEnum; import com.gitee.dbswitch.features.ProductFeatures; import com.gitee.dbswitch.provider.AbstractFactoryProvider; import com.gitee.dbswitch.provider.meta.MetadataProvider; -import com.gitee.dbswitch.provider.operate.TableOperateProvider; -import com.gitee.dbswitch.provider.sync.AutoCastTableDataSynchronizer; -import com.gitee.dbswitch.provider.sync.TableDataSynchronizer; +import com.gitee.dbswitch.provider.manage.TableManageProvider; +import com.gitee.dbswitch.provider.sync.AutoCastTableDataSynchronizeProvider; +import com.gitee.dbswitch.provider.sync.TableDataSynchronizeProvider; import com.gitee.dbswitch.provider.write.AutoCastTableDataWriteProvider; import com.gitee.dbswitch.provider.write.TableDataWriteProvider; import javax.sql.DataSource; @@ -38,8 +38,8 @@ public class PostgresFactoryProvider extends AbstractFactoryProvider { } @Override - public TableOperateProvider createTableOperateProvider() { - return new PostgresTableOperateProvider(this); + public TableManageProvider createTableManageProvider() { + return new PostgresTableManageProvider(this); } @Override @@ -50,7 +50,7 @@ public class PostgresFactoryProvider extends AbstractFactoryProvider { } @Override - public TableDataSynchronizer createTableDataSynchronizer() { - return new AutoCastTableDataSynchronizer(this); + public TableDataSynchronizeProvider createTableDataSynchronizeProvider() { + return new AutoCastTableDataSynchronizeProvider(this); } } diff --git a/dbswitch-product/dbswitch-product-postgresql/src/main/java/com/gitee/dbswitch/product/postgresql/PostgresTableOperateProvider.java b/dbswitch-product/dbswitch-product-postgresql/src/main/java/com/gitee/dbswitch/product/postgresql/PostgresTableManageProvider.java similarity index 79% rename from dbswitch-product/dbswitch-product-postgresql/src/main/java/com/gitee/dbswitch/product/postgresql/PostgresTableOperateProvider.java rename to dbswitch-product/dbswitch-product-postgresql/src/main/java/com/gitee/dbswitch/product/postgresql/PostgresTableManageProvider.java index 4a0e98a1..aff7437d 100644 --- a/dbswitch-product/dbswitch-product-postgresql/src/main/java/com/gitee/dbswitch/product/postgresql/PostgresTableOperateProvider.java +++ b/dbswitch-product/dbswitch-product-postgresql/src/main/java/com/gitee/dbswitch/product/postgresql/PostgresTableManageProvider.java @@ -10,13 +10,13 @@ package com.gitee.dbswitch.product.postgresql; import com.gitee.dbswitch.provider.ProductFactoryProvider; -import com.gitee.dbswitch.provider.operate.DefaultTableOperateProvider; +import com.gitee.dbswitch.provider.manage.DefaultTableManageProvider; import lombok.extern.slf4j.Slf4j; @Slf4j -public class PostgresTableOperateProvider extends DefaultTableOperateProvider { +public class PostgresTableManageProvider extends DefaultTableManageProvider { - public PostgresTableOperateProvider(ProductFactoryProvider factoryProvider) { + public PostgresTableManageProvider(ProductFactoryProvider factoryProvider) { super(factoryProvider); } diff --git a/dbswitch-product/dbswitch-product-sqlite/pom.xml b/dbswitch-product/dbswitch-product-sqlite/pom.xml index 521b2d76..d983e8a1 100644 --- a/dbswitch-product/dbswitch-product-sqlite/pom.xml +++ b/dbswitch-product/dbswitch-product-sqlite/pom.xml @@ -5,7 +5,7 @@ dbswitch-product com.gitee.dbswitch - 1.8.2 + 1.9.0 4.0.0 diff --git a/dbswitch-product/dbswitch-product-sqlite/src/main/java/com/gitee/dbswitch/product/sqlite/SqliteFactoryProvider.java b/dbswitch-product/dbswitch-product-sqlite/src/main/java/com/gitee/dbswitch/product/sqlite/SqliteFactoryProvider.java index 90195604..6ab7fc41 100644 --- a/dbswitch-product/dbswitch-product-sqlite/src/main/java/com/gitee/dbswitch/product/sqlite/SqliteFactoryProvider.java +++ b/dbswitch-product/dbswitch-product-sqlite/src/main/java/com/gitee/dbswitch/product/sqlite/SqliteFactoryProvider.java @@ -14,8 +14,8 @@ import com.gitee.dbswitch.common.type.ProductTypeEnum; import com.gitee.dbswitch.features.ProductFeatures; import com.gitee.dbswitch.provider.AbstractFactoryProvider; import com.gitee.dbswitch.provider.meta.MetadataProvider; -import com.gitee.dbswitch.provider.operate.TableOperateProvider; -import com.gitee.dbswitch.provider.sync.TableDataSynchronizer; +import com.gitee.dbswitch.provider.manage.TableManageProvider; +import com.gitee.dbswitch.provider.sync.TableDataSynchronizeProvider; import com.gitee.dbswitch.provider.write.TableDataWriteProvider; import javax.sql.DataSource; @@ -41,12 +41,12 @@ public class SqliteFactoryProvider extends AbstractFactoryProvider { } @Override - public TableOperateProvider createTableOperateProvider() { - return new SqliteTableOperateProvider(this); + public TableManageProvider createTableManageProvider() { + return new SqliteTableManageProvider(this); } @Override - public TableDataSynchronizer createTableDataSynchronizer() { + public TableDataSynchronizeProvider createTableDataSynchronizeProvider() { return new SqliteTableSynchronizer(this); } diff --git a/dbswitch-product/dbswitch-product-sqlite/src/main/java/com/gitee/dbswitch/product/sqlite/SqliteTableOperateProvider.java b/dbswitch-product/dbswitch-product-sqlite/src/main/java/com/gitee/dbswitch/product/sqlite/SqliteTableManageProvider.java similarity index 81% rename from dbswitch-product/dbswitch-product-sqlite/src/main/java/com/gitee/dbswitch/product/sqlite/SqliteTableOperateProvider.java rename to dbswitch-product/dbswitch-product-sqlite/src/main/java/com/gitee/dbswitch/product/sqlite/SqliteTableManageProvider.java index 5b371455..75e7194d 100644 --- a/dbswitch-product/dbswitch-product-sqlite/src/main/java/com/gitee/dbswitch/product/sqlite/SqliteTableOperateProvider.java +++ b/dbswitch-product/dbswitch-product-sqlite/src/main/java/com/gitee/dbswitch/product/sqlite/SqliteTableManageProvider.java @@ -10,11 +10,11 @@ package com.gitee.dbswitch.product.sqlite; import com.gitee.dbswitch.provider.ProductFactoryProvider; -import com.gitee.dbswitch.provider.operate.DefaultTableOperateProvider; +import com.gitee.dbswitch.provider.manage.DefaultTableManageProvider; -public class SqliteTableOperateProvider extends DefaultTableOperateProvider { +public class SqliteTableManageProvider extends DefaultTableManageProvider { - public SqliteTableOperateProvider(ProductFactoryProvider factoryProvider) { + public SqliteTableManageProvider(ProductFactoryProvider factoryProvider) { super(factoryProvider); } diff --git a/dbswitch-product/dbswitch-product-sqlite/src/main/java/com/gitee/dbswitch/product/sqlite/SqliteTableSynchronizer.java b/dbswitch-product/dbswitch-product-sqlite/src/main/java/com/gitee/dbswitch/product/sqlite/SqliteTableSynchronizer.java index 88dc370f..61281e22 100644 --- a/dbswitch-product/dbswitch-product-sqlite/src/main/java/com/gitee/dbswitch/product/sqlite/SqliteTableSynchronizer.java +++ b/dbswitch-product/dbswitch-product-sqlite/src/main/java/com/gitee/dbswitch/product/sqlite/SqliteTableSynchronizer.java @@ -10,11 +10,11 @@ package com.gitee.dbswitch.product.sqlite; import com.gitee.dbswitch.provider.ProductFactoryProvider; -import com.gitee.dbswitch.provider.sync.AutoCastTableDataSynchronizer; +import com.gitee.dbswitch.provider.sync.AutoCastTableDataSynchronizeProvider; import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction.support.DefaultTransactionDefinition; -public class SqliteTableSynchronizer extends AutoCastTableDataSynchronizer { +public class SqliteTableSynchronizer extends AutoCastTableDataSynchronizeProvider { public SqliteTableSynchronizer(ProductFactoryProvider factoryProvider) { super(factoryProvider); diff --git a/dbswitch-product/dbswitch-product-sqlserver/pom.xml b/dbswitch-product/dbswitch-product-sqlserver/pom.xml index 4d8257e9..6400bfa4 100644 --- a/dbswitch-product/dbswitch-product-sqlserver/pom.xml +++ b/dbswitch-product/dbswitch-product-sqlserver/pom.xml @@ -5,7 +5,7 @@ dbswitch-product com.gitee.dbswitch - 1.8.2 + 1.9.0 4.0.0 diff --git a/dbswitch-product/dbswitch-product-sqlserver/src/main/java/com/gitee/dbswitch/product/sqlserver/SqlserverFactoryProvider.java b/dbswitch-product/dbswitch-product-sqlserver/src/main/java/com/gitee/dbswitch/product/sqlserver/SqlserverFactoryProvider.java index 836d1a3d..3efbfff1 100644 --- a/dbswitch-product/dbswitch-product-sqlserver/src/main/java/com/gitee/dbswitch/product/sqlserver/SqlserverFactoryProvider.java +++ b/dbswitch-product/dbswitch-product-sqlserver/src/main/java/com/gitee/dbswitch/product/sqlserver/SqlserverFactoryProvider.java @@ -14,10 +14,10 @@ import com.gitee.dbswitch.common.type.ProductTypeEnum; import com.gitee.dbswitch.features.ProductFeatures; import com.gitee.dbswitch.provider.AbstractFactoryProvider; import com.gitee.dbswitch.provider.meta.MetadataProvider; -import com.gitee.dbswitch.provider.operate.DefaultTableOperateProvider; -import com.gitee.dbswitch.provider.operate.TableOperateProvider; -import com.gitee.dbswitch.provider.sync.AutoCastTableDataSynchronizer; -import com.gitee.dbswitch.provider.sync.TableDataSynchronizer; +import com.gitee.dbswitch.provider.manage.DefaultTableManageProvider; +import com.gitee.dbswitch.provider.manage.TableManageProvider; +import com.gitee.dbswitch.provider.sync.AutoCastTableDataSynchronizeProvider; +import com.gitee.dbswitch.provider.sync.TableDataSynchronizeProvider; import com.gitee.dbswitch.provider.write.AutoCastTableDataWriteProvider; import com.gitee.dbswitch.provider.write.TableDataWriteProvider; import javax.sql.DataSource; @@ -44,13 +44,13 @@ public class SqlserverFactoryProvider extends AbstractFactoryProvider { } @Override - public TableOperateProvider createTableOperateProvider() { - return new DefaultTableOperateProvider(this); + public TableManageProvider createTableManageProvider() { + return new DefaultTableManageProvider(this); } @Override - public TableDataSynchronizer createTableDataSynchronizer() { - return new AutoCastTableDataSynchronizer(this); + public TableDataSynchronizeProvider createTableDataSynchronizeProvider() { + return new AutoCastTableDataSynchronizeProvider(this); } } diff --git a/dbswitch-product/dbswitch-product-sybase/pom.xml b/dbswitch-product/dbswitch-product-sybase/pom.xml index 1a19db7c..252e097b 100644 --- a/dbswitch-product/dbswitch-product-sybase/pom.xml +++ b/dbswitch-product/dbswitch-product-sybase/pom.xml @@ -5,7 +5,7 @@ dbswitch-product com.gitee.dbswitch - 1.8.2 + 1.9.0 4.0.0 diff --git a/dbswitch-product/dbswitch-product-sybase/src/main/java/com/gitee/dbswitch/product/sybase/SybaseFactoryProvider.java b/dbswitch-product/dbswitch-product-sybase/src/main/java/com/gitee/dbswitch/product/sybase/SybaseFactoryProvider.java index 221b33e9..0a8afc0c 100644 --- a/dbswitch-product/dbswitch-product-sybase/src/main/java/com/gitee/dbswitch/product/sybase/SybaseFactoryProvider.java +++ b/dbswitch-product/dbswitch-product-sybase/src/main/java/com/gitee/dbswitch/product/sybase/SybaseFactoryProvider.java @@ -14,10 +14,10 @@ import com.gitee.dbswitch.common.type.ProductTypeEnum; import com.gitee.dbswitch.features.ProductFeatures; import com.gitee.dbswitch.provider.AbstractFactoryProvider; import com.gitee.dbswitch.provider.meta.MetadataProvider; -import com.gitee.dbswitch.provider.operate.DefaultTableOperateProvider; -import com.gitee.dbswitch.provider.operate.TableOperateProvider; -import com.gitee.dbswitch.provider.sync.AutoCastTableDataSynchronizer; -import com.gitee.dbswitch.provider.sync.TableDataSynchronizer; +import com.gitee.dbswitch.provider.manage.DefaultTableManageProvider; +import com.gitee.dbswitch.provider.manage.TableManageProvider; +import com.gitee.dbswitch.provider.sync.AutoCastTableDataSynchronizeProvider; +import com.gitee.dbswitch.provider.sync.TableDataSynchronizeProvider; import com.gitee.dbswitch.provider.write.AutoCastTableDataWriteProvider; import com.gitee.dbswitch.provider.write.TableDataWriteProvider; import javax.sql.DataSource; @@ -44,13 +44,13 @@ public class SybaseFactoryProvider extends AbstractFactoryProvider { } @Override - public TableOperateProvider createTableOperateProvider() { - return new DefaultTableOperateProvider(this); + public TableManageProvider createTableManageProvider() { + return new DefaultTableManageProvider(this); } @Override - public TableDataSynchronizer createTableDataSynchronizer() { - return new AutoCastTableDataSynchronizer(this); + public TableDataSynchronizeProvider createTableDataSynchronizeProvider() { + return new AutoCastTableDataSynchronizeProvider(this); } } diff --git a/dbswitch-product/dbswitch-register-product/pom.xml b/dbswitch-product/dbswitch-register-product/pom.xml index 51477fef..a3808fb0 100644 --- a/dbswitch-product/dbswitch-register-product/pom.xml +++ b/dbswitch-product/dbswitch-register-product/pom.xml @@ -5,7 +5,7 @@ dbswitch-product com.gitee.dbswitch - 1.8.2 + 1.9.0 4.0.0 diff --git a/dbswitch-product/pom.xml b/dbswitch-product/pom.xml index 31cddf42..749adecc 100644 --- a/dbswitch-product/pom.xml +++ b/dbswitch-product/pom.xml @@ -5,7 +5,7 @@ dbswitch-parent com.gitee.dbswitch - 1.8.2 + 1.9.0 4.0.0 dbswitch-product diff --git a/pom.xml b/pom.xml index 4c842814..c46c96f3 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 com.gitee.dbswitch dbswitch-parent - 1.8.2 + 1.9.0 pom dbswitch database switch project diff --git a/version.cmd b/version.cmd index 55c63f52..ba575ba5 100644 --- a/version.cmd +++ b/version.cmd @@ -1,6 +1,6 @@ @echo off -set APP_VERSION=1.8.2 +set APP_VERSION=1.9.0 echo "Clean Project ..." call mvn clean -f pom.xml