diff --git a/README.md b/README.md index 73289d5f..eefc3e38 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,10 @@ # 异构数据库数据与结构同步工具 +![](https://gitee.com/inrgihc/dbswitch/badge/star.svg) +![](https://gitee.com/inrgihc/dbswitch/badge/fork.svg?theme=gvp) + +![dbswitch](https://gitee.com/dromara/dbswitch/raw/master/dbswitch-admin-ui/src/assets/logo.png#pic_center) + ## 一、工具介绍 ### 1、功能描述 diff --git a/build-docker/dbswitch/dbswitch-release/conf/application.yml b/build-docker/dbswitch/dbswitch-release/conf/application.yml index 1b21cd61..bd0e402e 100644 --- a/build-docker/dbswitch/dbswitch-release/conf/application.yml +++ b/build-docker/dbswitch/dbswitch-release/conf/application.yml @@ -28,7 +28,7 @@ mybatis: lazy-loading-enabled: true aggressive-lazy-loading: false map-underscore-to-camel-case: true - log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + #log-impl: org.apache.ibatis.logging.stdout.StdOutImpl dbswitch: configuration: 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 acff3a35..c4033c09 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 @@ -30,6 +30,7 @@ import java.sql.Timestamp; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.ReentrantLock; +import lombok.Getter; import lombok.extern.slf4j.Slf4j; import org.springframework.core.task.AsyncTaskExecutor; @@ -55,7 +56,7 @@ public class ExecuteJobTaskRunnable implements Runnable { private AsyncTaskExecutor migrationTaskExecutor; - private Long taskId; + @Getter private Long taskId; private Integer schedule; diff --git a/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/service/AssignmentService.java b/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/service/AssignmentService.java index 4d104111..b8db94c8 100644 --- a/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/service/AssignmentService.java +++ b/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/service/AssignmentService.java @@ -85,8 +85,12 @@ public class AssignmentService { .convert(assignmentTaskDAO.getById(assignment.getId())); } - @Transactional(rollbackFor = Exception.class) public void deleteAssignment(Long id) { + AssignmentTaskEntity taskEntity = assignmentTaskDAO.getById(id); + if (null != taskEntity && null != taskEntity.getPublished() && taskEntity.getPublished()) { + throw new DbswitchException(ResultCode.ERROR_RESOURCE_HAS_DEPLOY, + "已经发布的任务需先下线后方可执行删除操作"); + } assignmentTaskDAO.deleteById(id); } @@ -194,7 +198,9 @@ public class AssignmentService { AssignmentTaskEntity assignmentTaskEntity = assignmentTaskDAO.getById(id); if (Objects.nonNull(assignmentTaskEntity.getPublished()) && assignmentTaskEntity.getPublished()) { - scheduleService.cancelByJobKey(assignmentTaskEntity.getJobKey()); + String jobKey = assignmentTaskEntity.getJobKey(); + scheduleService.cancelByJobKey(jobKey); + scheduleService.cancelManualJob(id); assignmentTaskEntity.setPublished(Boolean.FALSE); assignmentTaskEntity.setContent("{}"); assignmentTaskEntity.setJobKey(""); diff --git a/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/service/ScheduleService.java b/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/service/ScheduleService.java index d6405106..d4a86bb1 100644 --- a/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/service/ScheduleService.java +++ b/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/service/ScheduleService.java @@ -18,6 +18,7 @@ import com.gitee.dbswitch.admin.type.JobStatusEnum; import com.gitee.dbswitch.admin.type.ScheduleModeEnum; import com.gitee.dbswitch.common.event.TaskEventHub; import com.gitee.dbswitch.common.util.UuidUtils; +import com.google.common.collect.Sets; import java.sql.Timestamp; import java.util.Map; import java.util.Objects; @@ -111,13 +112,22 @@ public class ScheduleService { AssignmentTaskEntity task = assignmentTaskDAO.getById(taskId); if (ScheduleModeEnum.MANUAL == scheduleMode) { manualRunEvenHub.notify(evenName, taskId, jobKeyName); - //scheduleOnce(jobBuilder.storeDurably(false).build(), triggerKey); } else { scheduleCron(jobBuilder.storeDurably(true).build(), triggerKey, task.getCronExpression()); - } - task.setJobKey(jobKeyName); - assignmentTaskDAO.updateById(task); + task.setJobKey(jobKeyName); + assignmentTaskDAO.updateById(task); + } + } + + public void cancelManualJob(Long taskId) { + Sets.newHashSet(taskRunnableMap.values()).forEach( + runnable -> { + if (taskId == runnable.getTaskId()) { + runnable.interrupt(); + } + } + ); } public void cancelByJobKey(String jobKeyName) { @@ -165,24 +175,6 @@ public class ScheduleService { } } -// private void scheduleOnce(JobDetail jobDetail, TriggerKey triggerKey) { -// Scheduler scheduler = schedulerFactoryBean.getScheduler(); -// Trigger simpleTrigger = TriggerBuilder.newTrigger() -// .startAt(new Date()) -// .withIdentity(triggerKey) -// .withSchedule(SimpleScheduleBuilder.simpleSchedule().withRepeatCount(0)) -// .build(); -// -// try { -// scheduler.scheduleJob(jobDetail, simpleTrigger); -// } catch (SchedulerException e) { -// log.error("Quartz schedule task by manual failed, taskId: {}.", -// jobDetail.getJobDataMap().get(JobExecutorService.TASK_ID), e); -// throw new RuntimeException(e); -// } -// -// } - private void scheduleCron(JobDetail jobDetail, TriggerKey triggerKey, String cronExpression) { Scheduler scheduler = schedulerFactoryBean.getScheduler(); Trigger cronTrigger = TriggerBuilder.newTrigger() diff --git a/dbswitch-admin/src/main/resources/application.yml b/dbswitch-admin/src/main/resources/application.yml index 2ccba5a0..906775bb 100644 --- a/dbswitch-admin/src/main/resources/application.yml +++ b/dbswitch-admin/src/main/resources/application.yml @@ -28,7 +28,7 @@ mybatis: lazy-loading-enabled: true aggressive-lazy-loading: false map-underscore-to-camel-case: true - log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + #log-impl: org.apache.ibatis.logging.stdout.StdOutImpl dbswitch: configuration: diff --git a/dbswitch-admin/src/main/resources/application_sample_mysql.yml b/dbswitch-admin/src/main/resources/application_sample_mysql.yml index 2ccba5a0..906775bb 100644 --- a/dbswitch-admin/src/main/resources/application_sample_mysql.yml +++ b/dbswitch-admin/src/main/resources/application_sample_mysql.yml @@ -28,7 +28,7 @@ mybatis: lazy-loading-enabled: true aggressive-lazy-loading: false map-underscore-to-camel-case: true - log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + #log-impl: org.apache.ibatis.logging.stdout.StdOutImpl dbswitch: configuration: diff --git a/dbswitch-admin/src/main/resources/application_sample_postgres.yml b/dbswitch-admin/src/main/resources/application_sample_postgres.yml index d0e56ffb..ee5c30f3 100644 --- a/dbswitch-admin/src/main/resources/application_sample_postgres.yml +++ b/dbswitch-admin/src/main/resources/application_sample_postgres.yml @@ -28,7 +28,7 @@ mybatis: lazy-loading-enabled: true aggressive-lazy-loading: false map-underscore-to-camel-case: true - log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + #log-impl: org.apache.ibatis.logging.stdout.StdOutImpl dbswitch: configuration: diff --git a/dbswitch-common/src/main/java/com/gitee/dbswitch/common/util/ObjectCastUtils.java b/dbswitch-common/src/main/java/com/gitee/dbswitch/common/util/ObjectCastUtils.java index 2b651a2f..77d75e10 100644 --- a/dbswitch-common/src/main/java/com/gitee/dbswitch/common/util/ObjectCastUtils.java +++ b/dbswitch-common/src/main/java/com/gitee/dbswitch/common/util/ObjectCastUtils.java @@ -1,5 +1,6 @@ package com.gitee.dbswitch.common.util; +import cn.hutool.core.codec.Base64; import cn.hutool.json.JSONUtil; import java.io.ByteArrayOutputStream; import java.io.ObjectOutputStream; @@ -829,6 +830,8 @@ public final class ObjectCastUtils { return in.toString(); } else if (in instanceof java.sql.Clob) { return clob2Str((java.sql.Clob) in); + } else if (in instanceof java.sql.Blob) { + return Base64.encode(blob2Bytes((java.sql.Blob) in)); } else if (in instanceof java.lang.Number) { return in.toString(); } else if (in instanceof java.sql.RowId) { diff --git a/dbswitch-core/src/main/java/com/gitee/dbswitch/util/GenerateSqlUtils.java b/dbswitch-core/src/main/java/com/gitee/dbswitch/util/GenerateSqlUtils.java index 7050f730..a5ebc2c0 100644 --- a/dbswitch-core/src/main/java/com/gitee/dbswitch/util/GenerateSqlUtils.java +++ b/dbswitch-core/src/main/java/com/gitee/dbswitch/util/GenerateSqlUtils.java @@ -100,7 +100,7 @@ public final class GenerateSqlUtils { sb.append(")"); if (type.isLikeMysql()) { - sb.append("ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin"); + sb.append("ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin"); if (withRemarks && StringUtils.isNotBlank(tableRemarks)) { sb.append(String.format(" COMMENT='%s' ", tableRemarks.replace("'", "\\'"))); } 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/DbswichProperties.java index 201b50ba..022dc00f 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/DbswichProperties.java @@ -25,7 +25,7 @@ import org.springframework.context.annotation.PropertySource; */ @Configuration @Data -@ConfigurationProperties(prefix = "dbswitch", ignoreUnknownFields = false) +@ConfigurationProperties(prefix = "dbswitch") @PropertySource( value = {"classpath:config.properties", "classpath:config.yml", "classpath:config.yaml"}, ignoreResourceNotFound = true, 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 6bba1586..1a6f80dd 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 @@ -29,7 +29,7 @@ public class TargetDataSourceProperties { private CaseConvertEnum columnNameCase = CaseConvertEnum.NONE; private Boolean targetDrop = Boolean.TRUE; private Boolean onlyCreate = Boolean.FALSE; - private Boolean createTableAutoIncrement = Boolean.TRUE; + private Boolean createTableAutoIncrement = Boolean.FALSE; private Boolean writerEngineInsert = Boolean.FALSE; private Boolean changeDataSync = Boolean.FALSE; } diff --git a/dbswitch-product/dbswitch-product-sqlite/src/main/java/com/gitee/dbswitch/product/sqlite/SqliteMetadataQueryProvider.java b/dbswitch-product/dbswitch-product-sqlite/src/main/java/com/gitee/dbswitch/product/sqlite/SqliteMetadataQueryProvider.java index a616334f..6846543f 100644 --- a/dbswitch-product/dbswitch-product-sqlite/src/main/java/com/gitee/dbswitch/product/sqlite/SqliteMetadataQueryProvider.java +++ b/dbswitch-product/dbswitch-product-sqlite/src/main/java/com/gitee/dbswitch/product/sqlite/SqliteMetadataQueryProvider.java @@ -124,7 +124,7 @@ public class SqliteMetadataQueryProvider extends AbstractMetadataProvider { if (null != pks && !pks.isEmpty() && pks.contains(fieldname)) { // 关键字 AUTOINCREMENT 只能⽤于整型(INTEGER)字段。 if (useAutoInc) { - retval += "INTEGER PRIMARY KEY AUTOINCREMENT"; + retval += "INTEGER AUTOINCREMENT"; } else { retval += "BIGINT "; } diff --git a/images/admin_05.png b/images/admin_05.png index 51f7411b..6e90dbdf 100644 Binary files a/images/admin_05.png and b/images/admin_05.png differ diff --git a/images/to_greenplum.PNG b/images/to_greenplum.PNG deleted file mode 100644 index b180e4ff..00000000 Binary files a/images/to_greenplum.PNG and /dev/null differ diff --git a/images/to_mysql.PNG b/images/to_mysql.PNG deleted file mode 100644 index aa0fb39e..00000000 Binary files a/images/to_mysql.PNG and /dev/null differ diff --git a/images/to_oracle.PNG b/images/to_oracle.PNG deleted file mode 100644 index 78168ac3..00000000 Binary files a/images/to_oracle.PNG and /dev/null differ diff --git a/images/to_postgresql.PNG b/images/to_postgresql.PNG deleted file mode 100644 index ce246ba4..00000000 Binary files a/images/to_postgresql.PNG and /dev/null differ diff --git a/images/to_sqlserver.PNG b/images/to_sqlserver.PNG deleted file mode 100644 index 1fe72088..00000000 Binary files a/images/to_sqlserver.PNG and /dev/null differ