diff --git a/README.md b/README.md index 29b9f18f..a70028bd 100644 --- a/README.md +++ b/README.md @@ -22,16 +22,19 @@ ### 3、详细功能 -- 源端oracle/SqlServer/MySQL/MariaDB/PostgreSQL/DB2向目的端为Greenplum/PostgreSQL的迁移(**支持绝大多数常规类型字段**) +- 源端oracle/SqlServer/MySQL/MariaDB/PostgreSQL/DB2/DM/Kingbase8向目的端为Greenplum/PostgreSQL的迁移(**支持绝大多数常规类型字段**) -- 源端oracle/SqlServer/MySQL/MariaDB/PostgreSQL/DB2向目的端为Oralce的迁移(**支持绝大多数常规类型字段**) +- 源端oracle/SqlServer/MySQL/MariaDB/PostgreSQL/DB2DM/Kingbase8向目的端为Oralce的迁移(**支持绝大多数常规类型字段**) -- 源端oracle/SqlServer/MySQL/MariaDB/PostgreSQL/DB2向目的端为SQLServer的迁移(**字段类型兼容测试中...**) +- 源端oracle/SqlServer/MySQL/MariaDB/PostgreSQL/DB2DM/Kingbase8向目的端为SQLServer的迁移(**字段类型兼容测试中...**) -- 源端oracle/SqlServer/MySQL/MariaDB/PostgreSQL/DB2向目的端为MySQL/MariaDB的迁移(**字段类型兼容测试中...**) +- 源端oracle/SqlServer/MySQL/MariaDB/PostgreSQL/DB2DM/Kingbase8向目的端为MySQL/MariaDB的迁移(**字段类型兼容测试中...**) -- 源端oracle/SqlServer/MySQL/MariaDB/PostgreSQL/DB2向目的端为DB2的迁移(**字段类型兼容测试中...**) +- 源端oracle/SqlServer/MySQL/MariaDB/PostgreSQL/DB2DM/Kingbase8向目的端为DB2的迁移(**字段类型兼容测试中...**) +- 源端oracle/SqlServer/MySQL/MariaDB/PostgreSQL/DB2DM/Kingbase8向目的端为DM的迁移(**字段类型兼容测试中...**) + +- 源端oracle/SqlServer/MySQL/MariaDB/PostgreSQL/DB2DM/Kingbase8向目的端为Kingbase8的迁移(**字段类型兼容测试中...**) ### 4、结构设计 @@ -171,6 +174,20 @@ jdbc连接地址:jdbc:db2://172.17.20.91:50000/testdb:driverType=4;fullyMateri jdbc驱动名称:com.ibm.db2.jcc.DB2Driver ``` +- DM的驱动配置样例 + +``` +jdbc连接地址:jdbc:dm://172.17.20.91:5236 +jdbc驱动名称:dm.jdbc.driver.DmDriver +``` + +- Kingbase8的驱动配置样例 + +``` +jdbc连接地址:jdbc:kingbase8://172.17.20.91:54321/MYTEST +jdbc驱动名称:com.kingbase8.Driver +``` + 启动执行命令如下: linux系统下: diff --git a/dbswitch-common/pom.xml b/dbswitch-common/pom.xml index a970a7fe..f840af44 100644 --- a/dbswitch-common/pom.xml +++ b/dbswitch-common/pom.xml @@ -5,7 +5,7 @@ com.gitee dbswitch - 1.5.2 + 1.5.3 dbswitch-common diff --git a/dbswitch-common/src/main/java/com/gitee/dbswitch/common/constant/DatabaseTypeEnum.java b/dbswitch-common/src/main/java/com/gitee/dbswitch/common/constant/DatabaseTypeEnum.java index 3c44e425..5f6852e7 100644 --- a/dbswitch-common/src/main/java/com/gitee/dbswitch/common/constant/DatabaseTypeEnum.java +++ b/dbswitch-common/src/main/java/com/gitee/dbswitch/common/constant/DatabaseTypeEnum.java @@ -59,7 +59,17 @@ public enum DatabaseTypeEnum { /** * DB2数据库类型 */ - DB2(8); + DB2(8), + + /** + * DM数据库类型 + */ + DM(9), + + /** + * Kingbase数据库类型 + */ + KINGBASE(10); private int index; diff --git a/dbswitch-core/lib/DmJdbcDriver18.jar b/dbswitch-core/lib/DmJdbcDriver18.jar new file mode 100644 index 00000000..932d299a Binary files /dev/null and b/dbswitch-core/lib/DmJdbcDriver18.jar differ diff --git a/dbswitch-core/lib/kingbase8-8.2.0.jar b/dbswitch-core/lib/kingbase8-8.2.0.jar new file mode 100644 index 00000000..70a90256 Binary files /dev/null and b/dbswitch-core/lib/kingbase8-8.2.0.jar differ diff --git a/dbswitch-core/pom.xml b/dbswitch-core/pom.xml index 7f238b88..1eb4edc1 100644 --- a/dbswitch-core/pom.xml +++ b/dbswitch-core/pom.xml @@ -5,7 +5,7 @@ com.gitee dbswitch - 1.5.2 + 1.5.3 dbswitch-core @@ -78,6 +78,22 @@ ${project.basedir}/lib/greenplum-jdbc-5.1.4.jar + + com.dameng + dm-jdbc + 1.0.0 + system + ${project.basedir}/lib/DmJdbcDriver18.jar + + + + com.kingbase + kingbase-jdbc + 8.2.0 + system + ${project.basedir}/lib/kingbase8-8.2.0.jar + + org.mariadb.jdbc mariadb-java-client diff --git a/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/DatabaseFactory.java b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/DatabaseFactory.java index ca1ce191..83c42913 100644 --- a/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/DatabaseFactory.java +++ b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/DatabaseFactory.java @@ -13,7 +13,9 @@ import java.util.HashMap; import java.util.Map; import com.gitee.dbswitch.common.constant.DatabaseTypeEnum; import com.gitee.dbswitch.core.database.impl.DatabaseDB2Impl; +import com.gitee.dbswitch.core.database.impl.DatabaseDmImpl; import com.gitee.dbswitch.core.database.impl.DatabaseGreenplumImpl; +import com.gitee.dbswitch.core.database.impl.DatabaseKingbaseImpl; import com.gitee.dbswitch.core.database.impl.DatabaseMariaDBImpl; import com.gitee.dbswitch.core.database.impl.DatabaseMysqlImpl; import com.gitee.dbswitch.core.database.impl.DatabaseOracleImpl; @@ -41,6 +43,8 @@ public final class DatabaseFactory { put(DatabaseTypeEnum.GREENPLUM,DatabaseGreenplumImpl.class.getName()); put(DatabaseTypeEnum.MARIADB,DatabaseMariaDBImpl.class.getName()); put(DatabaseTypeEnum.DB2,DatabaseDB2Impl.class.getName()); + put(DatabaseTypeEnum.DM,DatabaseDmImpl.class.getName()); + put(DatabaseTypeEnum.KINGBASE,DatabaseKingbaseImpl.class.getName()); }}; public static AbstractDatabase getDatabaseInstance(DatabaseTypeEnum type) { diff --git a/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseDmImpl.java b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseDmImpl.java new file mode 100644 index 00000000..81ca9094 --- /dev/null +++ b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseDmImpl.java @@ -0,0 +1,121 @@ +// 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) +// Data : 2020/1/2 +// Location: beijing , china +///////////////////////////////////////////////////////////// +package com.gitee.dbswitch.core.database.impl; + +import java.util.List; +import com.alibaba.druid.sql.SQLUtils; +import com.gitee.dbswitch.common.constant.DatabaseTypeEnum; +import com.gitee.dbswitch.core.constant.Const; +import com.gitee.dbswitch.core.database.AbstractDatabase; +import com.gitee.dbswitch.core.database.IDatabaseInterface; +import com.gitee.dbswitch.core.model.ColumnDescription; +import com.gitee.dbswitch.core.model.ColumnMetaData; + +/** + * 支持DM数据库的元信息实现 + * + * @author tang + * + */ +public class DatabaseDmImpl extends AbstractDatabase implements IDatabaseInterface { + + public DatabaseDmImpl() { + super("dm.jdbc.driver.DmDriver"); + } + + @Override + public List querySelectSqlColumnMeta(String sql) { + String querySQL = String.format("SELECT * from (%s) tmp where ROWNUM<=1 ", sql.replace(";", "")); + return this.getSelectSqlColumnMeta(querySQL, DatabaseTypeEnum.DM); + } + + @Override + protected String getTableFieldsQuerySQL(String schemaName, String tableName) { + return String.format("SELECT * FROM \"%s\".\"%s\" ", schemaName, tableName); + } + + @Override + protected String getTestQuerySQL(String sql) { + return String.format("explain %s", sql.replace(";", "")); + } + + @Override + public String formatSQL(String sql) { + return SQLUtils.formatOracle(sql); + } + + @Override + public String getFieldDefinition(ColumnMetaData v, List pks, boolean useAutoInc, boolean addCr) { + String fieldname = v.getName(); + int length = v.getLength(); + int precision = v.getPrecision(); + + StringBuilder retval = new StringBuilder(128); + retval.append(" \"").append(fieldname).append("\" "); + + int type = v.getType(); + switch (type) { + case ColumnMetaData.TYPE_TIMESTAMP: + case ColumnMetaData.TYPE_TIME: + retval.append("TIMESTAMP"); + break; + case ColumnMetaData.TYPE_DATE: + retval.append("DATE"); + break; + case ColumnMetaData.TYPE_BOOLEAN: + retval.append("VARCHAR(32)"); + break; + case ColumnMetaData.TYPE_NUMBER: + case ColumnMetaData.TYPE_BIGNUMBER: + retval.append("NUMBER"); + if (length > 0) { + if (length > 38) { + length = 38; + } + + retval.append('(').append(length); + if (precision > 0) { + retval.append(", ").append(precision); + } + retval.append(')'); + } + break; + case ColumnMetaData.TYPE_INTEGER: + retval.append("INTEGER"); + break; + case ColumnMetaData.TYPE_STRING: + if (2*length >= AbstractDatabase.CLOB_LENGTH) { + retval.append("CLOB"); + } else { + if (length == 1) { + retval.append("NVARCHAR2(2)"); + } else if (length > 0 && length < 2048) { + retval.append("NVARCHAR2(").append(2*length).append(')'); + } else { + retval.append("CLOB"); + } + } + break; + case ColumnMetaData.TYPE_BINARY: + retval.append("BLOB"); + break; + default: + retval.append("CLOB"); + break; + } + + if (addCr) { + retval.append(Const.CR); + } + + return retval.toString(); + } + +} diff --git a/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseKingbaseImpl.java b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseKingbaseImpl.java new file mode 100644 index 00000000..a01e0313 --- /dev/null +++ b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseKingbaseImpl.java @@ -0,0 +1,136 @@ +// 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) +// Data : 2020/1/2 +// Location: beijing , china +///////////////////////////////////////////////////////////// +package com.gitee.dbswitch.core.database.impl; + +import java.util.List; +import com.alibaba.druid.sql.SQLUtils; +import com.gitee.dbswitch.common.constant.DatabaseTypeEnum; +import com.gitee.dbswitch.core.constant.Const; +import com.gitee.dbswitch.core.database.AbstractDatabase; +import com.gitee.dbswitch.core.database.IDatabaseInterface; +import com.gitee.dbswitch.core.model.ColumnDescription; +import com.gitee.dbswitch.core.model.ColumnMetaData; + +/** + * 支持Kingbase数据库的元信息实现 + * + * @author tang + * + */ +public class DatabaseKingbaseImpl extends AbstractDatabase implements IDatabaseInterface { + + public DatabaseKingbaseImpl() { + super("com.kingbase8.Driver"); + } + + @Override + public List querySelectSqlColumnMeta(String sql) { + String querySQL = String.format(" %s LIMIT 0 ", sql.replace(";", "")); + return this.getSelectSqlColumnMeta(querySQL, DatabaseTypeEnum.KINGBASE); + } + + @Override + protected String getTableFieldsQuerySQL(String schemaName, String tableName) { + return String.format("SELECT * FROM \"%s\".\"%s\" ", schemaName, tableName); + } + + @Override + protected String getTestQuerySQL(String sql) { + return String.format("explain %s", sql.replace(";", "")); + } + + @Override + public String formatSQL(String sql) { + return SQLUtils.formatPGSql(sql, null); + } + + @Override + public String getFieldDefinition(ColumnMetaData v, List pks, boolean useAutoInc, boolean addCr) { + String fieldname = v.getName(); + int length = v.getLength(); + int precision = v.getPrecision(); + int type = v.getType(); + + String retval = " \"" + fieldname + "\" "; + + switch (type) { + case ColumnMetaData.TYPE_TIMESTAMP: + retval += "TIMESTAMP"; + break; + case ColumnMetaData.TYPE_TIME: + retval += "TIME"; + break; + case ColumnMetaData.TYPE_DATE: + retval += "DATE"; + break; + case ColumnMetaData.TYPE_BOOLEAN: + retval += "VARCHAR(32)"; + break; + case ColumnMetaData.TYPE_NUMBER: + case ColumnMetaData.TYPE_INTEGER: + case ColumnMetaData.TYPE_BIGNUMBER: + if (null != pks && pks.contains(fieldname)) { + if (useAutoInc) { + retval += "BIGSERIAL"; + } else { + retval += "BIGINT"; + } + } else { + if (length > 0) { + if (precision > 0 || length > 18) { + if ((length + precision) > 0 && precision > 0) { + // Numeric(Precision, Scale): Precision = total length; Scale = decimal places + retval += "NUMERIC(" + (length + precision) + ", " + precision + ")"; + } else { + retval += "DOUBLE PRECISION"; + } + } else { + if (length > 9) { + retval += "BIGINT"; + } else { + if (length < 5) { + retval += "SMALLINT"; + } else { + retval += "INTEGER"; + } + } + } + + } else { + retval += "DOUBLE PRECISION"; + } + } + break; + case ColumnMetaData.TYPE_STRING: + if (length < 1 || length >= AbstractDatabase.CLOB_LENGTH) { + retval += "TEXT"; + } else { + if (null != pks && pks.contains(fieldname)) { + retval += "VARCHAR(" + length + ")"; + } else { + retval += "TEXT"; + } + } + break; + case ColumnMetaData.TYPE_BINARY: + retval += "BYTEA"; + break; + default: + retval += "TEXT"; + break; + } + + if (addCr) { + retval += Const.CR; + } + + return retval; + } +} diff --git a/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseOracleImpl.java b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseOracleImpl.java index 20787491..015bcd12 100644 --- a/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseOracleImpl.java +++ b/dbswitch-core/src/main/java/com/gitee/dbswitch/core/database/impl/DatabaseOracleImpl.java @@ -110,7 +110,7 @@ public class DatabaseOracleImpl extends AbstractDatabase implements IDatabaseInt @Override public List querySelectSqlColumnMeta(String sql) { String querySQL = String.format("SELECT * from (%s) tmp where ROWNUM<=1 ", sql.replace(";", "")); - return this.getSelectSqlColumnMeta(querySQL, DatabaseTypeEnum.MYSQL); + return this.getSelectSqlColumnMeta(querySQL, DatabaseTypeEnum.ORACLE); } @Override diff --git a/dbswitch-data/pom.xml b/dbswitch-data/pom.xml index d15d4af5..4692caef 100644 --- a/dbswitch-data/pom.xml +++ b/dbswitch-data/pom.xml @@ -5,7 +5,7 @@ com.gitee dbswitch - 1.5.2 + 1.5.3 dbswitch-data diff --git a/dbswitch-data/src/main/java/com/gitee/dbswitch/data/config/PropertiesConfig.java b/dbswitch-data/src/main/java/com/gitee/dbswitch/data/config/PropertiesConfig.java index 6b5947bb..aaad2cef 100644 --- a/dbswitch-data/src/main/java/com/gitee/dbswitch/data/config/PropertiesConfig.java +++ b/dbswitch-data/src/main/java/com/gitee/dbswitch/data/config/PropertiesConfig.java @@ -15,7 +15,7 @@ import com.gitee.dbswitch.core.service.IMetaDataService; import com.gitee.dbswitch.core.service.impl.MigrationMetaDataServiceImpl; /** - * 注册所有映射属性类 { }中用逗号分隔即可注册多个属性类 + * 配置类 * * @author tang * diff --git a/dbswitch-data/src/main/java/com/gitee/dbswitch/data/util/JdbcTemplateUtils.java b/dbswitch-data/src/main/java/com/gitee/dbswitch/data/util/JdbcTemplateUtils.java index 8b3756d7..f4b5b479 100644 --- a/dbswitch-data/src/main/java/com/gitee/dbswitch/data/util/JdbcTemplateUtils.java +++ b/dbswitch-data/src/main/java/com/gitee/dbswitch/data/util/JdbcTemplateUtils.java @@ -22,8 +22,8 @@ import org.springframework.dao.DataAccessException; import org.springframework.jdbc.core.ConnectionCallback; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.support.JdbcUtils; -import org.springframework.jdbc.support.MetaDataAccessException; import com.gitee.dbswitch.common.constant.DatabaseTypeEnum; +import com.gitee.dbswitch.dbcommon.util.DatabaseAwareUtils; /** * JdbcTemplate包制使用工具类型 @@ -44,15 +44,16 @@ public final class JdbcTemplateUtils { * @return DatabaseType 数据库类型 */ public static DatabaseTypeEnum getDatabaseProduceName(DataSource dataSource) { - try { - String productName = JdbcUtils.commonDatabaseName( - JdbcUtils.extractDatabaseMetaData(dataSource, "getDatabaseProductName").toString()); - if (productName.equalsIgnoreCase("Greenplum")) { - return DatabaseTypeEnum.GREENPLUM; - } else if (productName.equalsIgnoreCase("Microsoft SQL Server")) { - return DatabaseTypeEnum.SQLSERVER; - } - + String productName = DatabaseAwareUtils.getDatabaseNameByDataSource(dataSource); + if (productName.equalsIgnoreCase("Greenplum")) { + return DatabaseTypeEnum.GREENPLUM; + } else if (productName.equalsIgnoreCase("SQLServer")) { + return DatabaseTypeEnum.SQLSERVER; + } else if (productName.equalsIgnoreCase("DM")) { + return DatabaseTypeEnum.DM; + } else if (productName.equalsIgnoreCase("Kingbase")) { + return DatabaseTypeEnum.KINGBASE; + } else { DatabaseDriver databaseDriver = DatabaseDriver.fromProductName(productName); if (DatabaseDriver.MARIADB == databaseDriver) { return DatabaseTypeEnum.MARIADB; @@ -67,8 +68,6 @@ public final class JdbcTemplateUtils { } else { throw new RuntimeException(String.format("Unsupport database type by product name [%s]", productName)); } - } catch (MetaDataAccessException ex) { - throw new IllegalStateException("Unable to detect database type", ex); } } diff --git a/dbswitch-data/src/main/resources/config.properties b/dbswitch-data/src/main/resources/config.properties index b5f4f212..70b1e8d2 100644 --- a/dbswitch-data/src/main/resources/config.properties +++ b/dbswitch-data/src/main/resources/config.properties @@ -1,5 +1,5 @@ # source database connection information -## support MySQL/MariaDB/DB2/Oracle/SQLServer/PostgreSQL/Greenplum +## support MySQL/MariaDB/DB2/DM/Kingbase/Oracle/SQLServer/PostgreSQL/Greenplum dbswitch.source[0].url= jdbc:oracle:thin:@172.17.20.58:1521:ORCL dbswitch.source[0].driver-class-name= oracle.jdbc.driver.OracleDriver dbswitch.source[0].username= tang @@ -15,7 +15,7 @@ dbswitch.source[0].source-includes= dbswitch.source[0].source-excludes= # target database connection information -## support Oracle/PostgreSQL/Greenplum +## support Oracle/PostgreSQL/Greenplum/DM/Kingbase dbswitch.target.url= jdbc:postgresql://172.17.20.44:5432/study dbswitch.target.driver-class-name= org.postgresql.Driver dbswitch.target.username= tang diff --git a/dbswitch-dbchange/pom.xml b/dbswitch-dbchange/pom.xml index fba42892..5b36029c 100644 --- a/dbswitch-dbchange/pom.xml +++ b/dbswitch-dbchange/pom.xml @@ -5,7 +5,7 @@ com.gitee dbswitch - 1.5.2 + 1.5.3 dbswitch-dbchange diff --git a/dbswitch-dbcommon/pom.xml b/dbswitch-dbcommon/pom.xml index 23759be9..2b4da17e 100644 --- a/dbswitch-dbcommon/pom.xml +++ b/dbswitch-dbcommon/pom.xml @@ -3,7 +3,7 @@ com.gitee dbswitch - 1.5.2 + 1.5.3 dbswitch-dbcommon diff --git a/dbswitch-dbcommon/src/main/java/com/gitee/dbswitch/dbcommon/database/DatabaseOperatorFactory.java b/dbswitch-dbcommon/src/main/java/com/gitee/dbswitch/dbcommon/database/DatabaseOperatorFactory.java index 5547cd40..08a9b41b 100644 --- a/dbswitch-dbcommon/src/main/java/com/gitee/dbswitch/dbcommon/database/DatabaseOperatorFactory.java +++ b/dbswitch-dbcommon/src/main/java/com/gitee/dbswitch/dbcommon/database/DatabaseOperatorFactory.java @@ -13,15 +13,15 @@ import java.util.Map; import java.lang.reflect.Constructor; import java.util.HashMap; import javax.sql.DataSource; -import org.springframework.boot.jdbc.DatabaseDriver; -import org.springframework.jdbc.support.JdbcUtils; -import org.springframework.jdbc.support.MetaDataAccessException; import com.gitee.dbswitch.dbcommon.database.impl.DB2DatabaseOperator; +import com.gitee.dbswitch.dbcommon.database.impl.DmDatabaseOperator; import com.gitee.dbswitch.dbcommon.database.impl.GreenplumDatabaseOperator; +import com.gitee.dbswitch.dbcommon.database.impl.KingbaseDatabaseOperator; import com.gitee.dbswitch.dbcommon.database.impl.MysqlDatabaseOperator; import com.gitee.dbswitch.dbcommon.database.impl.OracleDatabaseOperator; import com.gitee.dbswitch.dbcommon.database.impl.PostgreSqlDatabaseOperator; import com.gitee.dbswitch.dbcommon.database.impl.SqlServerDatabaseOperator; +import com.gitee.dbswitch.dbcommon.util.DatabaseAwareUtils; /** * 数据库操作器构造工厂类 @@ -42,6 +42,8 @@ public final class DatabaseOperatorFactory { put("POSTGRESQL", PostgreSqlDatabaseOperator.class.getName()); put("GREENPLUM", GreenplumDatabaseOperator.class.getName()); put("DB2", DB2DatabaseOperator.class.getName()); + put("DM", DmDatabaseOperator.class.getName()); + put("KINGBASE", KingbaseDatabaseOperator.class.getName()); } }; @@ -52,7 +54,7 @@ public final class DatabaseOperatorFactory { * @return 指定类型的数据库读取器 */ public static IDatabaseOperator createDatabaseOperator(DataSource dataSource) { - String type = getDatabaseNameByDataSource(dataSource).toUpperCase(); + String type = DatabaseAwareUtils.getDatabaseNameByDataSource(dataSource).toUpperCase(); if (DATABASE_OPERATOR_MAPPER.containsKey(type)) { String className = DATABASE_OPERATOR_MAPPER.get(type); try { @@ -69,29 +71,4 @@ public final class DatabaseOperatorFactory { throw new RuntimeException(String.format("[dbcommon] Unkown Supported database type (%s)", type)); } - /** - * 根据DataSource获取数据库的类型 - * - * @param dataSource 数据库源 - * @return 数据库的类型:mysql/oracle/postgresql/sqlserver/greenplum/db2 - */ - public static String getDatabaseNameByDataSource(DataSource dataSource) { - try { - String productName = JdbcUtils.commonDatabaseName( - JdbcUtils.extractDatabaseMetaData(dataSource, "getDatabaseProductName").toString()); - if (productName.equalsIgnoreCase("Greenplum")) { - return "greenplum"; - } else if (productName.equalsIgnoreCase("Microsoft SQL Server")) { - return "sqlserver"; - } else { - DatabaseDriver databaseDriver = DatabaseDriver.fromProductName(productName); - if (databaseDriver == DatabaseDriver.UNKNOWN) { - throw new IllegalStateException("Unable to detect database type from data source instance"); - } - return databaseDriver.getId(); - } - } catch (MetaDataAccessException ex) { - throw new IllegalStateException("Unable to detect database type", ex); - } - } } diff --git a/dbswitch-dbcommon/src/main/java/com/gitee/dbswitch/dbcommon/database/impl/DmDatabaseOperator.java b/dbswitch-dbcommon/src/main/java/com/gitee/dbswitch/dbcommon/database/impl/DmDatabaseOperator.java new file mode 100644 index 00000000..30362e5b --- /dev/null +++ b/dbswitch-dbcommon/src/main/java/com/gitee/dbswitch/dbcommon/database/impl/DmDatabaseOperator.java @@ -0,0 +1,12 @@ +package com.gitee.dbswitch.dbcommon.database.impl; + +import javax.sql.DataSource; +import com.gitee.dbswitch.dbcommon.database.IDatabaseOperator; + +public class DmDatabaseOperator extends OracleDatabaseOperator implements IDatabaseOperator { + + public DmDatabaseOperator(DataSource dataSource) { + super(dataSource); + } + +} diff --git a/dbswitch-dbcommon/src/main/java/com/gitee/dbswitch/dbcommon/database/impl/KingbaseDatabaseOperator.java b/dbswitch-dbcommon/src/main/java/com/gitee/dbswitch/dbcommon/database/impl/KingbaseDatabaseOperator.java new file mode 100644 index 00000000..02ba4fee --- /dev/null +++ b/dbswitch-dbcommon/src/main/java/com/gitee/dbswitch/dbcommon/database/impl/KingbaseDatabaseOperator.java @@ -0,0 +1,12 @@ +package com.gitee.dbswitch.dbcommon.database.impl; + +import javax.sql.DataSource; +import com.gitee.dbswitch.dbcommon.database.IDatabaseOperator; + +public class KingbaseDatabaseOperator extends PostgreSqlDatabaseOperator implements IDatabaseOperator { + + public KingbaseDatabaseOperator(DataSource dataSource) { + super(dataSource); + } + +} diff --git a/dbswitch-dbcommon/src/main/java/com/gitee/dbswitch/dbcommon/util/DatabaseAwareUtils.java b/dbswitch-dbcommon/src/main/java/com/gitee/dbswitch/dbcommon/util/DatabaseAwareUtils.java index 9e596704..a3b0ec71 100644 --- a/dbswitch-dbcommon/src/main/java/com/gitee/dbswitch/dbcommon/util/DatabaseAwareUtils.java +++ b/dbswitch-dbcommon/src/main/java/com/gitee/dbswitch/dbcommon/util/DatabaseAwareUtils.java @@ -42,8 +42,12 @@ public final class DatabaseAwareUtils { return "greenplum"; } else if (productName.equalsIgnoreCase("Microsoft SQL Server")) { return "sqlserver"; + } else if (productName.equalsIgnoreCase("KingbaseES")) { + return "kingbase"; + } else if (productName.equalsIgnoreCase("DM DBMS")) { + return "dm"; } - + DatabaseDriver databaseDriver = DatabaseDriver.fromProductName(productName); if (databaseDriver == DatabaseDriver.UNKNOWN) { throw new IllegalStateException("Unable to detect database type from data source instance"); diff --git a/dbswitch-dbsynch/pom.xml b/dbswitch-dbsynch/pom.xml index a3b8f747..3550ece8 100644 --- a/dbswitch-dbsynch/pom.xml +++ b/dbswitch-dbsynch/pom.xml @@ -3,7 +3,7 @@ com.gitee dbswitch - 1.5.2 + 1.5.3 dbswitch-dbsynch diff --git a/dbswitch-dbsynch/src/main/java/com/gitee/dbswitch/dbsynch/DatabaseSynchronizeFactory.java b/dbswitch-dbsynch/src/main/java/com/gitee/dbswitch/dbsynch/DatabaseSynchronizeFactory.java index ba44bf67..25cef0b9 100644 --- a/dbswitch-dbsynch/src/main/java/com/gitee/dbswitch/dbsynch/DatabaseSynchronizeFactory.java +++ b/dbswitch-dbsynch/src/main/java/com/gitee/dbswitch/dbsynch/DatabaseSynchronizeFactory.java @@ -14,12 +14,13 @@ import java.util.HashMap; import javax.sql.DataSource; import com.gitee.dbswitch.dbcommon.util.DatabaseAwareUtils; import com.gitee.dbswitch.dbsynch.db2.DB2DatabaseSynchImpl; +import com.gitee.dbswitch.dbsynch.dm.DmDatabaseSynchImpl; +import com.gitee.dbswitch.dbsynch.kingbase.KingbaseDatabaseSynchImpl; import com.gitee.dbswitch.dbsynch.mssql.SqlServerDatabaseSynchImpl; import com.gitee.dbswitch.dbsynch.mysql.MySqlDatabaseSynchImpl; import com.gitee.dbswitch.dbsynch.oracle.OracleDatabaseSynchImpl; import com.gitee.dbswitch.dbsynch.pgsql.GreenplumDatabaseSynchImpl; import com.gitee.dbswitch.dbsynch.pgsql.PostgresqlDatabaseSynchImpl; - import java.lang.reflect.Constructor; /** @@ -41,6 +42,8 @@ public final class DatabaseSynchronizeFactory { put("POSTGRESQL", PostgresqlDatabaseSynchImpl.class.getName()); put("GREENPLUM", GreenplumDatabaseSynchImpl.class.getName()); put("DB2",DB2DatabaseSynchImpl.class.getName()); + put("DM",DmDatabaseSynchImpl.class.getName()); + put("KINGBASE",KingbaseDatabaseSynchImpl.class.getName()); } }; diff --git a/dbswitch-dbsynch/src/main/java/com/gitee/dbswitch/dbsynch/dm/DmDatabaseSynchImpl.java b/dbswitch-dbsynch/src/main/java/com/gitee/dbswitch/dbsynch/dm/DmDatabaseSynchImpl.java new file mode 100644 index 00000000..55a62f40 --- /dev/null +++ b/dbswitch-dbsynch/src/main/java/com/gitee/dbswitch/dbsynch/dm/DmDatabaseSynchImpl.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) +// Data : 2020/1/2 +// Location: beijing , china +///////////////////////////////////////////////////////////// +package com.gitee.dbswitch.dbsynch.dm; + +import javax.sql.DataSource; + +import com.gitee.dbswitch.dbsynch.oracle.OracleDatabaseSynchImpl; + +public class DmDatabaseSynchImpl extends OracleDatabaseSynchImpl { + + public DmDatabaseSynchImpl(DataSource ds) { + super(ds); + } + +} diff --git a/dbswitch-dbsynch/src/main/java/com/gitee/dbswitch/dbsynch/kingbase/KingbaseDatabaseSynchImpl.java b/dbswitch-dbsynch/src/main/java/com/gitee/dbswitch/dbsynch/kingbase/KingbaseDatabaseSynchImpl.java new file mode 100644 index 00000000..8bcb6bba --- /dev/null +++ b/dbswitch-dbsynch/src/main/java/com/gitee/dbswitch/dbsynch/kingbase/KingbaseDatabaseSynchImpl.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) +// Data : 2020/1/2 +// Location: beijing , china +///////////////////////////////////////////////////////////// +package com.gitee.dbswitch.dbsynch.kingbase; + +import javax.sql.DataSource; + +import com.gitee.dbswitch.dbsynch.pgsql.PostgresqlDatabaseSynchImpl; + +public class KingbaseDatabaseSynchImpl extends PostgresqlDatabaseSynchImpl { + + public KingbaseDatabaseSynchImpl(DataSource ds) { + super(ds); + } + +} diff --git a/dbswitch-dbwriter/pom.xml b/dbswitch-dbwriter/pom.xml index 9beee526..6d454129 100644 --- a/dbswitch-dbwriter/pom.xml +++ b/dbswitch-dbwriter/pom.xml @@ -5,7 +5,7 @@ com.gitee dbswitch - 1.5.2 + 1.5.3 dbswitch-dbwriter @@ -18,6 +18,11 @@ org.apache.commons commons-lang3 + + + com.gitee + dbswitch-dbcommon + ${project.version} com.gitee diff --git a/dbswitch-dbwriter/src/main/java/com/gitee/dbswitch/dbwriter/DatabaseWriterFactory.java b/dbswitch-dbwriter/src/main/java/com/gitee/dbswitch/dbwriter/DatabaseWriterFactory.java index 272db857..a2e085d3 100644 --- a/dbswitch-dbwriter/src/main/java/com/gitee/dbswitch/dbwriter/DatabaseWriterFactory.java +++ b/dbswitch-dbwriter/src/main/java/com/gitee/dbswitch/dbwriter/DatabaseWriterFactory.java @@ -12,9 +12,7 @@ package com.gitee.dbswitch.dbwriter; import java.util.Map; import java.util.HashMap; import javax.sql.DataSource; -import org.springframework.boot.jdbc.DatabaseDriver; -import org.springframework.jdbc.support.JdbcUtils; -import org.springframework.jdbc.support.MetaDataAccessException; +import com.gitee.dbswitch.dbcommon.util.DatabaseAwareUtils; import java.lang.reflect.Constructor; /** @@ -36,6 +34,9 @@ public class DatabaseWriterFactory { put("POSTGRESQL", "com.gitee.dbswitch.dbwriter.gpdb.GreenplumCopyWriterImpl"); put("GREENPLUM", "com.gitee.dbswitch.dbwriter.gpdb.GreenplumCopyWriterImpl"); put("DB2", "com.gitee.dbswitch.dbwriter.db2.DB2WriterImpl"); + put("DM", "com.gitee.dbswitch.dbwriter.dm.DmWriterImpl"); + //对于kingbase当前只能使用insert模式 + put("KINGBASE", "com.gitee.dbswitch.dbwriter.kingbase.KingbaseInsertWriterImpl"); } }; @@ -57,11 +58,15 @@ public class DatabaseWriterFactory { * @return 写入器对象 */ public static AbstractDatabaseWriter createDatabaseWriter(DataSource dataSource, boolean insert) { - String type = DatabaseWriterFactory.getDatabaseNameByDataSource(dataSource).toUpperCase(); + String type = DatabaseAwareUtils.getDatabaseNameByDataSource(dataSource).toUpperCase(); if (insert) { if ("POSTGRESQL".equalsIgnoreCase(type) || "GREENPLUM".equalsIgnoreCase(type)) { return new com.gitee.dbswitch.dbwriter.gpdb.GreenplumInsertWriterImpl(dataSource); } + + if ("KINGBASE".equalsIgnoreCase(type)) { + return new com.gitee.dbswitch.dbwriter.kingbase.KingbaseInsertWriterImpl(dataSource); + } } if (DATABASE_WRITER_MAPPER.containsKey(type.trim())) { @@ -81,29 +86,4 @@ public class DatabaseWriterFactory { throw new RuntimeException(String.format("[dbwrite] Unkown Supported database type (%s)", type)); } - /** - * 根据DataSource获取数据库的类型 - * - * @param dataSource 数据库源 - * @return 数据库的类型:mysql/oracle/postgresql/greenplum - */ - private static String getDatabaseNameByDataSource(DataSource dataSource) { - try { - String productName = JdbcUtils.commonDatabaseName( - JdbcUtils.extractDatabaseMetaData(dataSource, "getDatabaseProductName").toString()); - if (productName.equalsIgnoreCase("Greenplum")) { - return "greenplum"; - } else if (productName.equalsIgnoreCase("Microsoft SQL Server")) { - return "sqlserver"; - } - - DatabaseDriver databaseDriver = DatabaseDriver.fromProductName(productName); - if (databaseDriver == DatabaseDriver.UNKNOWN) { - throw new IllegalStateException("[dbwrite] Unable to detect database type from data source instance"); - } - return databaseDriver.getId(); - } catch (MetaDataAccessException ex) { - throw new IllegalStateException("[dbwrite] Unable to detect database type", ex); - } - } } diff --git a/dbswitch-dbwriter/src/main/java/com/gitee/dbswitch/dbwriter/dm/DmWriterImpl.java b/dbswitch-dbwriter/src/main/java/com/gitee/dbswitch/dbwriter/dm/DmWriterImpl.java new file mode 100644 index 00000000..208b082e --- /dev/null +++ b/dbswitch-dbwriter/src/main/java/com/gitee/dbswitch/dbwriter/dm/DmWriterImpl.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) +// Data : 2020/1/2 +// Location: beijing , china +///////////////////////////////////////////////////////////// +package com.gitee.dbswitch.dbwriter.dm; + +import javax.sql.DataSource; +import com.gitee.dbswitch.dbwriter.oracle.OracleWriterImpl; +import com.gitee.dbswitch.dbwriter.IDatabaseWriter; + +public class DmWriterImpl extends OracleWriterImpl implements IDatabaseWriter { + + public DmWriterImpl(DataSource dataSource) { + super(dataSource); + } + +} diff --git a/dbswitch-dbwriter/src/main/java/com/gitee/dbswitch/dbwriter/gpdb/GreenplumCopyWriterImpl.java b/dbswitch-dbwriter/src/main/java/com/gitee/dbswitch/dbwriter/gpdb/GreenplumCopyWriterImpl.java index e23ad106..adb704f4 100644 --- a/dbswitch-dbwriter/src/main/java/com/gitee/dbswitch/dbwriter/gpdb/GreenplumCopyWriterImpl.java +++ b/dbswitch-dbwriter/src/main/java/com/gitee/dbswitch/dbwriter/gpdb/GreenplumCopyWriterImpl.java @@ -473,9 +473,7 @@ public class GreenplumCopyWriterImpl extends AbstractDatabaseWriter implements I } }); } - if (log.isDebugEnabled()) { - log.debug("Greenplum copy write data affect count:{}", count); - } + return count; } catch (SQLException e) { throw new RuntimeException(e); diff --git a/dbswitch-dbwriter/src/main/java/com/gitee/dbswitch/dbwriter/gpdb/GreenplumInsertWriterImpl.java b/dbswitch-dbwriter/src/main/java/com/gitee/dbswitch/dbwriter/gpdb/GreenplumInsertWriterImpl.java index 21bf99f4..7c9bbee7 100644 --- a/dbswitch-dbwriter/src/main/java/com/gitee/dbswitch/dbwriter/gpdb/GreenplumInsertWriterImpl.java +++ b/dbswitch-dbwriter/src/main/java/com/gitee/dbswitch/dbwriter/gpdb/GreenplumInsertWriterImpl.java @@ -71,9 +71,6 @@ public class GreenplumInsertWriterImpl extends AbstractDatabaseWriter implements recordValues.clear(); transactionManager.commit(status); - if (log.isDebugEnabled()) { - log.debug("Greenplum insert data affect count:{}", affectCount); - } return affectCount; } catch (TransactionException e) { transactionManager.rollback(status); diff --git a/dbswitch-dbwriter/src/main/java/com/gitee/dbswitch/dbwriter/kingbase/KingbaseCopyWriterImpl.java b/dbswitch-dbwriter/src/main/java/com/gitee/dbswitch/dbwriter/kingbase/KingbaseCopyWriterImpl.java new file mode 100644 index 00000000..41b97f4f --- /dev/null +++ b/dbswitch-dbwriter/src/main/java/com/gitee/dbswitch/dbwriter/kingbase/KingbaseCopyWriterImpl.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) +// Data : 2020/1/2 +// Location: beijing , china +///////////////////////////////////////////////////////////// +package com.gitee.dbswitch.dbwriter.kingbase; + +import javax.sql.DataSource; +import com.gitee.dbswitch.dbwriter.IDatabaseWriter; +import com.gitee.dbswitch.dbwriter.gpdb.GreenplumCopyWriterImpl; + +public class KingbaseCopyWriterImpl extends GreenplumCopyWriterImpl implements IDatabaseWriter { + + public KingbaseCopyWriterImpl(DataSource dataSource) { + super(dataSource); + } + +} diff --git a/dbswitch-dbwriter/src/main/java/com/gitee/dbswitch/dbwriter/kingbase/KingbaseInsertWriterImpl.java b/dbswitch-dbwriter/src/main/java/com/gitee/dbswitch/dbwriter/kingbase/KingbaseInsertWriterImpl.java new file mode 100644 index 00000000..5a1490ef --- /dev/null +++ b/dbswitch-dbwriter/src/main/java/com/gitee/dbswitch/dbwriter/kingbase/KingbaseInsertWriterImpl.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) +// Data : 2020/1/2 +// Location: beijing , china +///////////////////////////////////////////////////////////// +package com.gitee.dbswitch.dbwriter.kingbase; + +import javax.sql.DataSource; +import com.gitee.dbswitch.dbwriter.IDatabaseWriter; +import com.gitee.dbswitch.dbwriter.gpdb.GreenplumInsertWriterImpl; + +public class KingbaseInsertWriterImpl extends GreenplumInsertWriterImpl implements IDatabaseWriter { + + public KingbaseInsertWriterImpl(DataSource dataSource) { + super(dataSource); + } +} diff --git a/dbswitch-pgwriter/pom.xml b/dbswitch-pgwriter/pom.xml index 093e225c..93ac5f58 100644 --- a/dbswitch-pgwriter/pom.xml +++ b/dbswitch-pgwriter/pom.xml @@ -5,7 +5,7 @@ com.gitee dbswitch - 1.5.2 + 1.5.3 dbswitch-pgwriter diff --git a/dbswitch-sql/pom.xml b/dbswitch-sql/pom.xml index 625aa4ef..18091bdd 100644 --- a/dbswitch-sql/pom.xml +++ b/dbswitch-sql/pom.xml @@ -5,7 +5,7 @@ com.gitee dbswitch - 1.5.2 + 1.5.3 dbswitch-sql diff --git a/dbswitch-webapi/pom.xml b/dbswitch-webapi/pom.xml index 9138d34a..c241350c 100644 --- a/dbswitch-webapi/pom.xml +++ b/dbswitch-webapi/pom.xml @@ -5,7 +5,7 @@ com.gitee dbswitch - 1.5.2 + 1.5.3 dbswitch-webapi diff --git a/package-tool/pom.xml b/package-tool/pom.xml index 930b4f8d..050418ce 100644 --- a/package-tool/pom.xml +++ b/package-tool/pom.xml @@ -5,7 +5,7 @@ com.gitee dbswitch - 1.5.2 + 1.5.3 package-tool diff --git a/pom.xml b/pom.xml index 2d0a1e3e..77386a69 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ com.gitee dbswitch - 1.5.2 + 1.5.3 pom dbswitch database switch project diff --git a/version.cmd b/version.cmd index 3271f5ab..5cb0bed7 100644 --- a/version.cmd +++ b/version.cmd @@ -1,6 +1,6 @@ @echo off -set APP_VERSION=1.5.2 +set APP_VERSION=1.5.3 echo "Clean Project ..." call mvn clean -f pom.xml