Search in sources :

Example 6 with MappingConfig

use of com.alibaba.otter.canal.client.adapter.rdb.config.MappingConfig in project canal by alibaba.

the class RdbMirrorDbSyncService method sync.

/**
 * 批量同步方法
 *
 * @param dmls 批量 DML
 */
public void sync(List<Dml> dmls) {
    List<Dml> dmlList = new ArrayList<>();
    for (Dml dml : dmls) {
        String destination = StringUtils.trimToEmpty(dml.getDestination());
        String database = dml.getDatabase();
        MirrorDbConfig mirrorDbConfig = mirrorDbConfigCache.get(destination + "." + database);
        if (mirrorDbConfig == null) {
            continue;
        }
        if (mirrorDbConfig.getMappingConfig() == null) {
            continue;
        }
        if (dml.getGroupId() != null && StringUtils.isNotEmpty(mirrorDbConfig.getMappingConfig().getGroupId())) {
            if (!mirrorDbConfig.getMappingConfig().getGroupId().equals(dml.getGroupId())) {
                // 如果groupId不匹配则过滤
                continue;
            }
        }
        if (dml.getIsDdl() != null && dml.getIsDdl() && StringUtils.isNotEmpty(dml.getSql())) {
            // DDL
            if (logger.isDebugEnabled()) {
                logger.debug("DDL: {}", JSON.toJSONString(dml, SerializerFeature.WriteMapNullValue));
            }
            executeDdl(mirrorDbConfig, dml);
            rdbSyncService.getColumnsTypeCache().remove(destination + "." + database + "." + dml.getTable());
            // 删除对应库表配置
            mirrorDbConfig.getTableConfig().remove(dml.getTable());
        } else {
            // DML
            initMappingConfig(dml.getTable(), mirrorDbConfig.getMappingConfig(), mirrorDbConfig, dml);
            dmlList.add(dml);
        }
    }
    if (!dmlList.isEmpty()) {
        rdbSyncService.sync(dmlList, dml -> {
            MirrorDbConfig mirrorDbConfig = mirrorDbConfigCache.get(dml.getDestination() + "." + dml.getDatabase());
            if (mirrorDbConfig == null) {
                return false;
            }
            String table = dml.getTable();
            MappingConfig config = mirrorDbConfig.getTableConfig().get(table);
            if (config == null) {
                return false;
            }
            // 是否区分大小写
            boolean caseInsensitive = config.getDbMapping().isCaseInsensitive();
            if (config.getConcurrent()) {
                List<SingleDml> singleDmls = SingleDml.dml2SingleDmls(dml, caseInsensitive);
                singleDmls.forEach(singleDml -> {
                    int hash = rdbSyncService.pkHash(config.getDbMapping(), singleDml.getData());
                    RdbSyncService.SyncItem syncItem = new RdbSyncService.SyncItem(config, singleDml);
                    rdbSyncService.getDmlsPartition()[hash].add(syncItem);
                });
            } else {
                int hash = 0;
                List<SingleDml> singleDmls = SingleDml.dml2SingleDmls(dml, caseInsensitive);
                singleDmls.forEach(singleDml -> {
                    RdbSyncService.SyncItem syncItem = new RdbSyncService.SyncItem(config, singleDml);
                    rdbSyncService.getDmlsPartition()[hash].add(syncItem);
                });
            }
            return true;
        });
    }
}
Also used : Dml(com.alibaba.otter.canal.client.adapter.support.Dml) SingleDml(com.alibaba.otter.canal.client.adapter.rdb.support.SingleDml) SingleDml(com.alibaba.otter.canal.client.adapter.rdb.support.SingleDml) ArrayList(java.util.ArrayList) MirrorDbConfig(com.alibaba.otter.canal.client.adapter.rdb.config.MirrorDbConfig) MappingConfig(com.alibaba.otter.canal.client.adapter.rdb.config.MappingConfig)

Aggregations

MappingConfig (com.alibaba.otter.canal.client.adapter.rdb.config.MappingConfig)6 LinkedHashMap (java.util.LinkedHashMap)3 SingleDml (com.alibaba.otter.canal.client.adapter.rdb.support.SingleDml)2 SQLException (java.sql.SQLException)2 DruidDataSource (com.alibaba.druid.pool.DruidDataSource)1 MirrorDbConfig (com.alibaba.otter.canal.client.adapter.rdb.config.MirrorDbConfig)1 RdbConfigMonitor (com.alibaba.otter.canal.client.adapter.rdb.monitor.RdbConfigMonitor)1 RdbEtlService (com.alibaba.otter.canal.client.adapter.rdb.service.RdbEtlService)1 RdbMirrorDbSyncService (com.alibaba.otter.canal.client.adapter.rdb.service.RdbMirrorDbSyncService)1 RdbSyncService (com.alibaba.otter.canal.client.adapter.rdb.service.RdbSyncService)1 Dml (com.alibaba.otter.canal.client.adapter.support.Dml)1 EtlResult (com.alibaba.otter.canal.client.adapter.support.EtlResult)1 Connection (java.sql.Connection)1 ArrayList (java.util.ArrayList)1 Map (java.util.Map)1 ConcurrentHashMap (java.util.concurrent.ConcurrentHashMap)1