浏览代码

fix storage bug

AE86 4 年之前
父节点
当前提交
4cfac4ae7d
共有 17 个文件被更改,包括 205 次插入99 次删除
  1. 3 3
      dbsyncer-biz/src/main/java/org/dbsyncer/biz/vo/DataVo.java
  2. 71 0
      dbsyncer-connector/src/main/java/org/dbsyncer/connector/config/SqlBuilderConfig.java
  3. 2 2
      dbsyncer-connector/src/main/java/org/dbsyncer/connector/database/AbstractDatabaseConnector.java
  4. 13 0
      dbsyncer-connector/src/main/java/org/dbsyncer/connector/database/AbstractSqlBuilder.java
  5. 9 10
      dbsyncer-connector/src/main/java/org/dbsyncer/connector/database/sqlbuilder/SqlBuilder.java
  6. 9 6
      dbsyncer-connector/src/main/java/org/dbsyncer/connector/database/sqlbuilder/SqlBuilderDelete.java
  7. 10 4
      dbsyncer-connector/src/main/java/org/dbsyncer/connector/database/sqlbuilder/SqlBuilderInsert.java
  8. 23 4
      dbsyncer-connector/src/main/java/org/dbsyncer/connector/database/sqlbuilder/SqlBuilderQuery.java
  9. 9 4
      dbsyncer-connector/src/main/java/org/dbsyncer/connector/database/sqlbuilder/SqlBuilderUpdate.java
  10. 1 1
      dbsyncer-parser/src/main/java/org/dbsyncer/parser/flush/FlushServiceImpl.java
  11. 44 53
      dbsyncer-storage/src/main/java/org/dbsyncer/storage/support/MysqlStorageServiceImpl.java
  12. 3 2
      dbsyncer-storage/src/main/java/org/dbsyncer/storage/util/ParamsUtil.java
  13. 2 2
      dbsyncer-storage/src/main/resources/dbsyncer_config.sql
  14. 2 3
      dbsyncer-storage/src/main/resources/dbsyncer_data.sql
  15. 1 2
      dbsyncer-storage/src/main/resources/dbsyncer_log.sql
  16. 1 1
      dbsyncer-web/src/main/resources/application.properties
  17. 2 2
      dbsyncer-web/src/main/resources/public/monitor/monitor.html

+ 3 - 3
dbsyncer-biz/src/main/java/org/dbsyncer/biz/vo/DataVo.java

@@ -3,7 +3,7 @@ package org.dbsyncer.biz.vo;
 public class DataVo {
 
     private String id;
-    private boolean success;
+    private int success;
     private String event;
     private String error;
     private String json;
@@ -17,11 +17,11 @@ public class DataVo {
         this.id = id;
     }
 
-    public boolean isSuccess() {
+    public int getSuccess() {
         return success;
     }
 
-    public void setSuccess(boolean success) {
+    public void setSuccess(int success) {
         this.success = success;
     }
 

+ 71 - 0
dbsyncer-connector/src/main/java/org/dbsyncer/connector/config/SqlBuilderConfig.java

@@ -0,0 +1,71 @@
+package org.dbsyncer.connector.config;
+
+import org.dbsyncer.connector.database.Database;
+
+import java.util.List;
+
+public class SqlBuilderConfig {
+
+    private Database     database;
+    // 表名
+    private String       tableName;
+    // 主键
+    private String       pk;
+    // 字段名称
+    private List<String> filedNames;
+    // 字段别名
+    private List<String> labelNames;
+    // 过滤条件
+    private String       queryFilter;
+    // 引号
+    private String       quotation;
+
+    public SqlBuilderConfig(Database database, String tableName, String pk, List<String> filedNames, String queryFilter,
+                            String quotation) {
+        this.database = database;
+        this.tableName = tableName;
+        this.pk = pk;
+        this.filedNames = filedNames;
+        this.queryFilter = queryFilter;
+        this.quotation = quotation;
+    }
+
+    public SqlBuilderConfig(Database database, String tableName, String pk, List<String> filedNames,
+                            List<String> labelNames, String queryFilter, String quotation) {
+        this.database = database;
+        this.tableName = tableName;
+        this.pk = pk;
+        this.filedNames = filedNames;
+        this.labelNames = labelNames;
+        this.queryFilter = queryFilter;
+        this.quotation = quotation;
+    }
+
+    public Database getDatabase() {
+        return database;
+    }
+
+    public String getTableName() {
+        return tableName;
+    }
+
+    public String getPk() {
+        return pk;
+    }
+
+    public List<String> getFiledNames() {
+        return filedNames;
+    }
+
+    public List<String> getLabelNames() {
+        return labelNames;
+    }
+
+    public String getQueryFilter() {
+        return queryFilter;
+    }
+
+    public String getQuotation() {
+        return quotation;
+    }
+}

+ 2 - 2
dbsyncer-connector/src/main/java/org/dbsyncer/connector/database/AbstractDatabaseConnector.java

@@ -479,8 +479,8 @@ public abstract class AbstractDatabaseConnector implements Database {
             throw new ConnectorException("Table name can not be empty.");
         }
 
-        String quotation = buildSqlWithQuotation();
-        return SqlBuilderEnum.getSqlBuilder(type).buildSql(tableName, pk, filedNames, queryFilterSQL, quotation, this);
+        SqlBuilderConfig config = new SqlBuilderConfig(this, tableName, pk, filedNames, queryFilterSQL, buildSqlWithQuotation());
+        return SqlBuilderEnum.getSqlBuilder(type).buildSql(config);
     }
 
     /**

+ 13 - 0
dbsyncer-connector/src/main/java/org/dbsyncer/connector/database/AbstractSqlBuilder.java

@@ -0,0 +1,13 @@
+package org.dbsyncer.connector.database;
+
+import org.dbsyncer.connector.ConnectorException;
+import org.dbsyncer.connector.config.SqlBuilderConfig;
+import org.dbsyncer.connector.database.sqlbuilder.SqlBuilder;
+
+public abstract class AbstractSqlBuilder implements SqlBuilder {
+
+    @Override
+    public String buildQuerySql(SqlBuilderConfig config) {
+        throw new ConnectorException("Not implemented");
+    }
+}

+ 9 - 10
dbsyncer-connector/src/main/java/org/dbsyncer/connector/database/sqlbuilder/SqlBuilder.java

@@ -1,8 +1,6 @@
 package org.dbsyncer.connector.database.sqlbuilder;
 
-import org.dbsyncer.connector.database.Database;
-
-import java.util.List;
+import org.dbsyncer.connector.config.SqlBuilderConfig;
 
 /**
  * SQL生成器
@@ -15,14 +13,15 @@ public interface SqlBuilder {
 
     /**
      * 生成SQL
-     * @param tableName
-     * @param pk
-     * @param filedNames
-     * @param queryFilter
-     * @param quotation
-     * @param database
+     * @param config
      * @return
      */
-    String buildSql(String tableName, String pk, List<String> filedNames, String queryFilter, String quotation, Database database);
+    String buildSql(SqlBuilderConfig config);
 
+    /**
+     * 生成查询SQL
+     * @param config
+     * @return
+     */
+    String buildQuerySql(SqlBuilderConfig config);
 }

+ 9 - 6
dbsyncer-connector/src/main/java/org/dbsyncer/connector/database/sqlbuilder/SqlBuilderDelete.java

@@ -2,27 +2,30 @@ package org.dbsyncer.connector.database.sqlbuilder;
 
 import org.apache.commons.lang.StringUtils;
 import org.dbsyncer.connector.ConnectorException;
-import org.dbsyncer.connector.database.Database;
+import org.dbsyncer.connector.config.SqlBuilderConfig;
+import org.dbsyncer.connector.database.AbstractSqlBuilder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.util.List;
-
 /**
  * @author AE86
  * @version 1.0.0
  * @date 2019/9/27 0:03
  */
-public class SqlBuilderDelete implements SqlBuilder {
+public class SqlBuilderDelete extends AbstractSqlBuilder {
 
     private final Logger logger = LoggerFactory.getLogger(getClass());
 
     @Override
-    public String buildSql(String tableName, String pk, List<String> filedNames, String queryFilter, String quotation, Database database) {
-        if(StringUtils.isBlank(pk)){
+    public String buildSql(SqlBuilderConfig config) {
+        String pk = config.getPk();
+
+        if (StringUtils.isBlank(pk)) {
             logger.error("Table primary key can not be empty.");
             throw new ConnectorException("Table primary key can not be empty.");
         }
+        String tableName = config.getTableName();
+        String quotation = config.getQuotation();
         // DELETE FROM "USER" WHERE "ID"=?
         return new StringBuilder().append("DELETE FROM ").append(quotation).append(tableName).append(quotation).append(" WHERE ").append(quotation).append(pk).append(quotation)
                 .append("=?").toString();

+ 10 - 4
dbsyncer-connector/src/main/java/org/dbsyncer/connector/database/sqlbuilder/SqlBuilderInsert.java

@@ -1,6 +1,7 @@
 package org.dbsyncer.connector.database.sqlbuilder;
 
-import org.dbsyncer.connector.database.Database;
+import org.dbsyncer.connector.config.SqlBuilderConfig;
+import org.dbsyncer.connector.database.AbstractSqlBuilder;
 
 import java.util.List;
 
@@ -9,10 +10,14 @@ import java.util.List;
  * @version 1.0.0
  * @date 2019/9/26 23:58
  */
-public class SqlBuilderInsert implements SqlBuilder {
+public class SqlBuilderInsert extends AbstractSqlBuilder {
 
     @Override
-    public String buildSql(String tableName, String pk, List<String> filedNames, String queryFilter, String quotation, Database database) {
+    public String buildSql(SqlBuilderConfig config) {
+        String tableName = config.getTableName();
+        List<String> filedNames = config.getFiledNames();
+        String quotation = config.getQuotation();
+
         StringBuilder sql = new StringBuilder();
         StringBuilder fs = new StringBuilder();
         StringBuilder vs = new StringBuilder();
@@ -29,7 +34,8 @@ public class SqlBuilderInsert implements SqlBuilder {
             }
         }
         // INSERT INTO "USER"("USERNAME","AGE") VALUES (?,?)
-        sql.insert(0, "INSERT INTO ").append(quotation).append(tableName).append(quotation).append("(").append(fs).append(") VALUES (").append(vs).append(")");
+        sql.insert(0, "INSERT INTO ").append(quotation).append(tableName).append(quotation).append("(").append(fs).append(") VALUES (")
+                .append(vs).append(")");
         return sql.toString();
     }
 

+ 23 - 4
dbsyncer-connector/src/main/java/org/dbsyncer/connector/database/sqlbuilder/SqlBuilderQuery.java

@@ -1,6 +1,9 @@
 package org.dbsyncer.connector.database.sqlbuilder;
 
 import org.apache.commons.lang.StringUtils;
+import org.dbsyncer.common.util.CollectionUtils;
+import org.dbsyncer.connector.config.SqlBuilderConfig;
+import org.dbsyncer.connector.database.AbstractSqlBuilder;
 import org.dbsyncer.connector.database.Database;
 
 import java.util.List;
@@ -10,21 +13,37 @@ import java.util.List;
  * @version 1.0.0
  * @date 2019/9/27 0:03
  */
-public class SqlBuilderQuery implements SqlBuilder {
+public class SqlBuilderQuery extends AbstractSqlBuilder {
 
     @Override
-    public String buildSql(String tableName, String pk, List<String> filedNames, String queryFilter, String quotation, Database database) {
+    public String buildSql(SqlBuilderConfig config) {
         // 分页语句
-        return database.getPageSql(tableName, pk, buildStandardSql(tableName, pk, filedNames, queryFilter, quotation));
+        Database database = config.getDatabase();
+        return database.getPageSql(config.getTableName(), config.getPk(), buildQuerySql(config));
     }
 
-    public String buildStandardSql(String tableName, String pk, List<String> filedNames, String queryFilter, String quotation) {
+    @Override
+    public String buildQuerySql(SqlBuilderConfig config) {
+        String tableName = config.getTableName();
+        List<String> filedNames = config.getFiledNames();
+        List<String> labelNames = config.getLabelNames();
+        boolean appendLabel = !CollectionUtils.isEmpty(labelNames);
+        String quotation = config.getQuotation();
+        String queryFilter = config.getQueryFilter();
+
         StringBuilder sql = new StringBuilder();
         int size = filedNames.size();
         int end = size - 1;
         for (int i = 0; i < size; i++) {
             // "USERNAME"
             sql.append(quotation).append(filedNames.get(i)).append(quotation);
+
+            // label
+            if(appendLabel){
+                // name as "myName"
+                sql.append(" as \"").append(labelNames.get(i)).append("\"");
+            }
+
             //如果不是最后一个字段
             if (i < end) {
                 sql.append(", ");

+ 9 - 4
dbsyncer-connector/src/main/java/org/dbsyncer/connector/database/sqlbuilder/SqlBuilderUpdate.java

@@ -2,7 +2,8 @@ package org.dbsyncer.connector.database.sqlbuilder;
 
 import org.apache.commons.lang.StringUtils;
 import org.dbsyncer.connector.ConnectorException;
-import org.dbsyncer.connector.database.Database;
+import org.dbsyncer.connector.config.SqlBuilderConfig;
+import org.dbsyncer.connector.database.AbstractSqlBuilder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -13,16 +14,20 @@ import java.util.List;
  * @version 1.0.0
  * @date 2019/9/27 0:03
  */
-public class SqlBuilderUpdate implements SqlBuilder {
+public class SqlBuilderUpdate extends AbstractSqlBuilder {
 
     private final Logger logger = LoggerFactory.getLogger(getClass());
 
     @Override
-    public String buildSql(String tableName, String pk, List<String> filedNames, String queryFilter, String quotation, Database database) {
-        if(StringUtils.isBlank(pk)){
+    public String buildSql(SqlBuilderConfig config) {
+        String pk = config.getPk();
+        if (StringUtils.isBlank(pk)) {
             logger.error("Table primary key can not be empty.");
             throw new ConnectorException("Table primary key can not be empty.");
         }
+        String tableName = config.getTableName();
+        List<String> filedNames = config.getFiledNames();
+        String quotation = config.getQuotation();
         StringBuilder sql = new StringBuilder();
         int size = filedNames.size();
         int end = size - 1;

+ 1 - 1
dbsyncer-parser/src/main/java/org/dbsyncer/parser/flush/FlushServiceImpl.java

@@ -50,7 +50,7 @@ public class FlushServiceImpl implements FlushService {
         List<Map> list = data.parallelStream().map(r -> {
             Map<String, Object> params = new HashMap();
             params.put(ConfigConstant.CONFIG_MODEL_ID, String.valueOf(snowflakeIdWorker.nextId()));
-            params.put(ConfigConstant.DATA_SUCCESS, success);
+            params.put(ConfigConstant.DATA_SUCCESS, success ? 1 : 0);
             params.put(ConfigConstant.DATA_EVENT, event);
             params.put(ConfigConstant.DATA_ERROR, error);
             params.put(ConfigConstant.CONFIG_MODEL_JSON, JsonUtil.objToJson(r));

+ 44 - 53
dbsyncer-storage/src/main/java/org/dbsyncer/storage/support/MysqlStorageServiceImpl.java

@@ -4,9 +4,9 @@ import org.apache.commons.dbcp.DelegatingDatabaseMetaData;
 import org.apache.commons.lang.StringUtils;
 import org.dbsyncer.common.util.CollectionUtils;
 import org.dbsyncer.connector.config.DatabaseConfig;
+import org.dbsyncer.connector.config.SqlBuilderConfig;
 import org.dbsyncer.connector.constant.DatabaseConstant;
 import org.dbsyncer.connector.database.Database;
-import org.dbsyncer.connector.database.sqlbuilder.SqlBuilderQuery;
 import org.dbsyncer.connector.enums.SqlBuilderEnum;
 import org.dbsyncer.connector.mysql.MysqlConnector;
 import org.dbsyncer.connector.util.DatabaseUtil;
@@ -31,7 +31,6 @@ import java.io.*;
 import java.lang.reflect.Field;
 import java.sql.Connection;
 import java.sql.DatabaseMetaData;
-import java.sql.Timestamp;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -55,6 +54,7 @@ public class MysqlStorageServiceImpl extends AbstractStorageService {
     private static final String PREFIX_TABLE      = "dbsyncer_";
     private static final String SHOW_TABLE        = "show tables where Tables_in_%s = \"%s\"";
     private static final String DROP_TABLE        = "DROP TABLE %s";
+    private static final String TRUNCATE_TABLE    = "TRUNCATE TABLE %s";
     private static final String TABLE_CREATE_TIME = "create_time";
     private static final String TABLE_UPDATE_TIME = "update_time";
 
@@ -70,13 +70,6 @@ public class MysqlStorageServiceImpl extends AbstractStorageService {
 
     @PostConstruct
     private void init() {
-        config = null == config ? new DatabaseConfig() : config;
-        config.setUrl(StringUtils.isNotBlank(config.getUrl()) ? config.getUrl()
-                : "jdbc:mysql://127.0.0.1:3306/dbsyncer?rewriteBatchedStatements=true&seUnicode=true&characterEncoding=UTF8&useSSL=true");
-        config.setDriverClassName(
-                StringUtils.isNotBlank(config.getDriverClassName()) ? config.getDriverClassName() : "com.mysql.jdbc.Driver");
-        config.setUsername(StringUtils.isNotBlank(config.getUsername()) ? config.getUsername() : "root");
-        config.setPassword(StringUtils.isNotBlank(config.getPassword()) ? config.getPassword() : "123");
         logger.info("url:{}", config.getUrl());
         logger.info("driverClassName:{}", config.getDriverClassName());
         logger.info("username:{}", config.getUsername());
@@ -140,8 +133,18 @@ public class MysqlStorageServiceImpl extends AbstractStorageService {
 
     @Override
     public void deleteAll(StorageEnum type, String table) {
-        String sql = String.format(DROP_TABLE, PREFIX_TABLE.concat(table));
-        jdbcTemplate.execute(sql);
+        Executor executor = getExecutor(type, table);
+        if(executor.isSystemType()){
+            String sql = String.format(TRUNCATE_TABLE, PREFIX_TABLE.concat(table));
+            jdbcTemplate.execute(sql);
+            return;
+        }
+
+        if (tables.containsKey(table)) {
+            tables.remove(table);
+            String sql = String.format(DROP_TABLE, PREFIX_TABLE.concat(table));
+            jdbcTemplate.execute(sql);
+        }
     }
 
     @Override
@@ -151,7 +154,9 @@ public class MysqlStorageServiceImpl extends AbstractStorageService {
 
     @Override
     public void insertData(StorageEnum type, String table, List<Map> list) {
-        executeInsert(type, table, list);
+        if (!CollectionUtils.isEmpty(list)) {
+            list.forEach(params -> executeInsert(type, table, params));
+        }
     }
 
     @Override
@@ -176,12 +181,8 @@ public class MysqlStorageServiceImpl extends AbstractStorageService {
         return insert;
     }
 
-    private void executeInsert(StorageEnum type, String table, List<Map> list) {
-
-    }
-
     private List<Object> getParams(Executor executor, Map params) {
-        return executor.getFieldPairs().stream().map(p -> p.convert(params.get(p.labelName))).collect(Collectors.toList());
+        return executor.getFieldPairs().stream().map(p -> params.get(p.labelName)).collect(Collectors.toList());
     }
 
     private Executor getExecutor(StorageEnum type, String table) {
@@ -232,24 +233,22 @@ public class MysqlStorageServiceImpl extends AbstractStorageService {
                 new FieldPair(ConfigConstant.CONFIG_MODEL_ID),
                 new FieldPair(ConfigConstant.CONFIG_MODEL_NAME),
                 new FieldPair(ConfigConstant.CONFIG_MODEL_TYPE),
-                new TimestampFieldPair(ConfigConstant.CONFIG_MODEL_CREATE_TIME, TABLE_CREATE_TIME),
-                new TimestampFieldPair(ConfigConstant.CONFIG_MODEL_UPDATE_TIME, TABLE_UPDATE_TIME),
+                new FieldPair(ConfigConstant.CONFIG_MODEL_CREATE_TIME, TABLE_CREATE_TIME),
+                new FieldPair(ConfigConstant.CONFIG_MODEL_UPDATE_TIME, TABLE_UPDATE_TIME),
                 new FieldPair(ConfigConstant.CONFIG_MODEL_JSON));
         // 日志
         List<FieldPair> logFields = Arrays.asList(
                 new FieldPair(ConfigConstant.CONFIG_MODEL_ID),
-                new FieldPair(ConfigConstant.CONFIG_MODEL_NAME),
                 new FieldPair(ConfigConstant.CONFIG_MODEL_TYPE),
-                new TimestampFieldPair(ConfigConstant.CONFIG_MODEL_CREATE_TIME, TABLE_CREATE_TIME),
+                new FieldPair(ConfigConstant.CONFIG_MODEL_CREATE_TIME, TABLE_CREATE_TIME),
                 new FieldPair(ConfigConstant.CONFIG_MODEL_JSON));
         // 数据
         List<FieldPair> dataFields = Arrays.asList(
                 new FieldPair(ConfigConstant.CONFIG_MODEL_ID),
-                new FieldPair(ConfigConstant.CONFIG_MODEL_NAME),
                 new FieldPair(ConfigConstant.DATA_SUCCESS),
                 new FieldPair(ConfigConstant.DATA_EVENT),
                 new FieldPair(ConfigConstant.DATA_ERROR),
-                new TimestampFieldPair(ConfigConstant.CONFIG_MODEL_CREATE_TIME, TABLE_CREATE_TIME),
+                new FieldPair(ConfigConstant.CONFIG_MODEL_CREATE_TIME, TABLE_CREATE_TIME),
                 new FieldPair(ConfigConstant.CONFIG_MODEL_JSON));
         tables.putIfAbsent(StorageEnum.CONFIG.getType(), new Executor(StorageEnum.CONFIG, configFields));
         tables.putIfAbsent(StorageEnum.LOG.getType(), new Executor(StorageEnum.LOG, logFields));
@@ -279,12 +278,19 @@ public class MysqlStorageServiceImpl extends AbstractStorageService {
             jdbcTemplate.execute(ddl);
         }
 
-        String pk = ConfigConstant.CONFIG_MODEL_ID;
-        List<String> fieldName = executor.getFieldPairs().stream().map(p -> p.columnName).collect(Collectors.toList());
-        String query = new SqlBuilderQuery().buildStandardSql(table, pk, fieldName, "", "");
-        String insert = SqlBuilderEnum.INSERT.getSqlBuilder().buildSql(table, pk, fieldName, "", "", connector);
-        String update = SqlBuilderEnum.UPDATE.getSqlBuilder().buildSql(table, pk, fieldName, "", "", connector);
-        String delete = SqlBuilderEnum.DELETE.getSqlBuilder().buildSql(table, pk, fieldName, "", "", connector);
+        List<String> fieldNames = new ArrayList<>();
+        List<String> labelNames = new ArrayList<>();
+        executor.getFieldPairs().forEach(p -> {
+            fieldNames.add(p.columnName);
+            labelNames.add(p.labelName);
+        });
+        final SqlBuilderConfig config = new SqlBuilderConfig(connector, table, ConfigConstant.CONFIG_MODEL_ID, fieldNames, labelNames, "",
+                "");
+
+        String query = SqlBuilderEnum.QUERY.getSqlBuilder().buildQuerySql(config);
+        String insert = SqlBuilderEnum.INSERT.getSqlBuilder().buildSql(config);
+        String update = SqlBuilderEnum.UPDATE.getSqlBuilder().buildSql(config);
+        String delete = SqlBuilderEnum.DELETE.getSqlBuilder().buildSql(config);
         executor.setQuery(query).setInsert(insert).setUpdate(update).setDelete(delete);
     }
 
@@ -325,41 +331,19 @@ public class MysqlStorageServiceImpl extends AbstractStorageService {
         this.config = config;
     }
 
-    interface FieldHandler {
-        Object convert(Object val);
-    }
-
     class FieldPair {
-        String       labelName;
-        String       columnName;
-        FieldHandler handler;
+        String labelName;
+        String columnName;
 
         public FieldPair(String labelName) {
             this.labelName = labelName;
             this.columnName = labelName;
-            this.handler = val -> val;
         }
 
         public FieldPair(String labelName, String columnName) {
             this.labelName = labelName;
             this.columnName = columnName;
         }
-
-        public Object convert(Object val) {
-            return val;
-        }
-    }
-
-    class TimestampFieldPair extends FieldPair {
-
-        public TimestampFieldPair(String labelName, String columnName) {
-            super(labelName, columnName);
-        }
-
-        @Override
-        public Object convert(Object val) {
-            return new Timestamp((Long) val);
-        }
     }
 
     class Executor {
@@ -370,16 +354,19 @@ public class MysqlStorageServiceImpl extends AbstractStorageService {
         private StorageEnum     group;
         private List<FieldPair> fieldPairs;
         private boolean         dynamicTableName;
+        private boolean         systemType;
 
         public Executor(StorageEnum group, List<FieldPair> fieldPairs) {
             this.group = group;
             this.fieldPairs = fieldPairs;
+            this.systemType = true;
         }
 
         public Executor(StorageEnum group, List<FieldPair> fieldPairs, boolean dynamicTableName) {
             this.group = group;
             this.fieldPairs = fieldPairs;
             this.dynamicTableName = dynamicTableName;
+            this.systemType = false;
         }
 
         public String getQuery() {
@@ -429,5 +416,9 @@ public class MysqlStorageServiceImpl extends AbstractStorageService {
         public boolean isDynamicTableName() {
             return dynamicTableName;
         }
+
+        public boolean isSystemType() {
+            return systemType;
+        }
     }
 }

+ 3 - 2
dbsyncer-storage/src/main/java/org/dbsyncer/storage/util/ParamsUtil.java

@@ -90,14 +90,15 @@ public abstract class ParamsUtil {
         Assert.notNull(params, "Params can not be null.");
         Document doc = new Document();
         String id = (String) params.get(ConfigConstant.CONFIG_MODEL_ID);
-        Boolean success = (Boolean) params.get(ConfigConstant.DATA_SUCCESS);
+        Integer success = (Integer) params.get(ConfigConstant.DATA_SUCCESS);
         String event = (String) params.get(ConfigConstant.DATA_EVENT);
         String error = (String) params.get(ConfigConstant.DATA_ERROR);
         String json = (String) params.get(ConfigConstant.CONFIG_MODEL_JSON);
         Long createTime = (Long) params.get(ConfigConstant.CONFIG_MODEL_CREATE_TIME);
 
         doc.add(new StringField(ConfigConstant.CONFIG_MODEL_ID, id, Field.Store.YES));
-        doc.add(new StringField(ConfigConstant.DATA_SUCCESS, String.valueOf(success), Field.Store.YES));
+        doc.add(new IntPoint(ConfigConstant.DATA_SUCCESS, success));
+        doc.add(new StoredField(ConfigConstant.DATA_SUCCESS, success));
         doc.add(new StringField(ConfigConstant.DATA_EVENT, event, Field.Store.YES));
         doc.add(new TextField(ConfigConstant.DATA_ERROR, error, Field.Store.YES));
         doc.add(new StoredField(ConfigConstant.CONFIG_MODEL_JSON, json));

+ 2 - 2
dbsyncer-storage/src/main/resources/dbsyncer_config.sql

@@ -2,8 +2,8 @@ CREATE TABLE `dbsyncer_config` (
   `ID` varchar(64) COLLATE utf8_bin NOT NULL COMMENT '唯一ID',
   `NAME` varchar(50) COLLATE utf8_bin NOT NULL COMMENT '名称',
   `TYPE` varchar(24) COLLATE utf8_bin NOT NULL COMMENT 'connector、mapping、tableGroup、meta、config',
-  `CREATE_TIME` datetime NOT NULL COMMENT '创建时间',
-  `UPDATE_TIME` datetime NOT NULL COMMENT '修改时间',
+  `CREATE_TIME` bigint(13) NOT NULL COMMENT '创建时间',
+  `UPDATE_TIME` bigint(13) NOT NULL COMMENT '修改时间',
   `JSON` text COLLATE utf8_bin NOT NULL COMMENT '配置信息',
   PRIMARY KEY (`ID`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='配置信息表';

+ 2 - 3
dbsyncer-storage/src/main/resources/dbsyncer_data.sql

@@ -1,10 +1,9 @@
 CREATE TABLE `dbsyncer_data` (
   `ID` varchar(64) COLLATE utf8_bin NOT NULL COMMENT '唯一ID',
-  `NAME` varchar(50) COLLATE utf8_bin NOT NULL COMMENT '名称',
-  `SUCCESS` varchar(6) COLLATE utf8_bin NOT NULL COMMENT '是否成功:true/false',
+  `SUCCESS` int(1) COLLATE utf8_bin NOT NULL COMMENT '成功1/失败0',
   `EVENT` varchar(255) COLLATE utf8_bin NOT NULL COMMENT '事件',
   `ERROR` varchar(1024) COLLATE utf8_bin DEFAULT NULL COMMENT '异常信息',
-  `CREATE_TIME` datetime NOT NULL COMMENT '创建时间',
+  `CREATE_TIME` bigint(13) NOT NULL COMMENT '创建时间',
   `JSON` text COLLATE utf8_bin NOT NULL COMMENT '同步数据',
   PRIMARY KEY (`ID`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='同步数据表';

+ 1 - 2
dbsyncer-storage/src/main/resources/dbsyncer_log.sql

@@ -1,8 +1,7 @@
 CREATE TABLE `dbsyncer_log` (
   `ID` varchar(64) COLLATE utf8_bin NOT NULL COMMENT '唯一ID',
-  `NAME` varchar(50) COLLATE utf8_bin NOT NULL COMMENT '名称',
   `TYPE` varchar(24) COLLATE utf8_bin NOT NULL COMMENT '连接器、映射配置、表映射、元信息、系统日志',
-  `CREATE_TIME` datetime NOT NULL COMMENT '创建时间',
+  `CREATE_TIME` bigint(13) NOT NULL COMMENT '创建时间',
   `JSON` text COLLATE utf8_bin NOT NULL COMMENT '日志信息',
   PRIMARY KEY (`ID`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='操作日志表';

+ 1 - 1
dbsyncer-web/src/main/resources/application.properties

@@ -12,7 +12,7 @@ server.servlet.context-path=/
 dbsyncer.storage.id=1
 dbsyncer.storage.support.disk=true
 #dbsyncer.storage.support.mysql=true
-#dbsyncer.storage.support.mysql.config.url=jdbc:mysql://127.0.0.1:3306/dbsyncer?rewriteBatchedStatements=true&seUnicode=true&characterEncoding=UTF8&useSSL=true
+#dbsyncer.storage.support.mysql.config.url=jdbc:mysql://127.0.0.1:3306/dbsyncer?rewriteBatchedStatements=true&seUnicode=true&characterEncoding=UTF8&serverTimezone=UTC&useSSL=false&verifyServerCertificate=false
 #dbsyncer.storage.support.mysql.config.driverClassName=com.mysql.jdbc.Driver
 #dbsyncer.storage.support.mysql.config.username=root
 #dbsyncer.storage.support.mysql.config.password=123

+ 2 - 2
dbsyncer-web/src/main/resources/public/monitor/monitor.html

@@ -43,8 +43,8 @@
                             <td th:text="${s.index}+1"></td>
                             <td th:text="${d?.event}"></td>
                             <td>
-                                <span th:if="${d?.success}" class="label label-success">成功</span>
-                                <span th:if="${not d?.success}" class="label label-warning">失败</span>
+                                <span th:if="${d?.success == 1}" class="label label-success">成功</span>
+                                <span th:if="${d?.success == 0}" class="label label-warning">失败</span>
                             </td>
                             <td th:text="${d?.error}"></td>
                             <td th:text="${#dates.format(d?.createTime, 'yyyy-MM-dd HH:mm:ss')}"></td>