|
@@ -6,7 +6,6 @@ import java.util.ArrayList;
|
|
|
import java.util.LinkedHashMap;
|
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
|
-import java.util.concurrent.ConcurrentHashMap;
|
|
|
|
|
|
import javax.sql.DataSource;
|
|
|
|
|
@@ -14,7 +13,10 @@ import org.apache.commons.lang.StringUtils;
|
|
|
import org.slf4j.Logger;
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
|
|
+import com.alibaba.fastjson.JSON;
|
|
|
+import com.alibaba.fastjson.serializer.SerializerFeature;
|
|
|
import com.alibaba.otter.canal.client.adapter.rdb.config.MappingConfig;
|
|
|
+import com.alibaba.otter.canal.client.adapter.rdb.config.MirrorDbConfig;
|
|
|
import com.alibaba.otter.canal.client.adapter.rdb.support.SingleDml;
|
|
|
import com.alibaba.otter.canal.client.adapter.support.Dml;
|
|
|
|
|
@@ -26,15 +28,13 @@ import com.alibaba.otter.canal.client.adapter.support.Dml;
|
|
|
*/
|
|
|
public class RdbMirrorDbSyncService {
|
|
|
|
|
|
- private static final Logger logger = LoggerFactory.getLogger(RdbMirrorDbSyncService.class);
|
|
|
+ private static final Logger logger = LoggerFactory.getLogger(RdbMirrorDbSyncService.class);
|
|
|
|
|
|
- private Map<String, MappingConfig> mirrorDbConfigCache; // 镜像库配置
|
|
|
- private DataSource dataSource;
|
|
|
- private RdbSyncService rdbSyncService; // rdbSyncService代理
|
|
|
+ private Map<String, MirrorDbConfig> mirrorDbConfigCache; // 镜像库配置
|
|
|
+ private DataSource dataSource;
|
|
|
+ private RdbSyncService rdbSyncService; // rdbSyncService代理
|
|
|
|
|
|
- private final Map<String, MappingConfig> tableDbConfigCache = new ConcurrentHashMap<>(); // 自动生成的库表配置缓存
|
|
|
-
|
|
|
- public RdbMirrorDbSyncService(Map<String, MappingConfig> mirrorDbConfigCache, DataSource dataSource,
|
|
|
+ public RdbMirrorDbSyncService(Map<String, MirrorDbConfig> mirrorDbConfigCache, DataSource dataSource,
|
|
|
Integer threads, Map<String, Map<String, Integer>> columnsTypeCache){
|
|
|
this.mirrorDbConfigCache = mirrorDbConfigCache;
|
|
|
this.dataSource = dataSource;
|
|
@@ -52,27 +52,32 @@ public class RdbMirrorDbSyncService {
|
|
|
for (Dml dml : dmls) {
|
|
|
String destination = StringUtils.trimToEmpty(dml.getDestination());
|
|
|
String database = dml.getDatabase();
|
|
|
- MappingConfig configMap = mirrorDbConfigCache.get(destination + "." + database);
|
|
|
- if (configMap == null) {
|
|
|
+ MirrorDbConfig mirrorDbConfig = mirrorDbConfigCache.get(destination + "." + database);
|
|
|
+ if (mirrorDbConfig == null) {
|
|
|
continue;
|
|
|
}
|
|
|
- if (dml.getSql() != null) {
|
|
|
+ if (StringUtils.isNotEmpty(dml.getSql())) {
|
|
|
// DDL
|
|
|
- executeDdl(dml);
|
|
|
+ if (logger.isDebugEnabled()) {
|
|
|
+ logger.debug("DDL: {}", JSON.toJSONString(dml, SerializerFeature.WriteMapNullValue));
|
|
|
+ }
|
|
|
+ executeDdl(mirrorDbConfig, dml);
|
|
|
rdbSyncService.getColumnsTypeCache().remove(destination + "." + database + "." + dml.getTable());
|
|
|
- tableDbConfigCache.remove(destination + "." + database + "." + dml.getTable()); // 删除对应库表配置
|
|
|
+ mirrorDbConfig.getTableConfig().remove(dml.getTable()); // 删除对应库表配置
|
|
|
} else {
|
|
|
// DML
|
|
|
- initMappingConfig(destination + "." + database + "." + dml.getTable(), configMap, 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());
|
|
|
String destination = StringUtils.trimToEmpty(dml.getDestination());
|
|
|
String database = dml.getDatabase();
|
|
|
String table = dml.getTable();
|
|
|
- MappingConfig config = tableDbConfigCache.get(destination + "." + database + "." + table);
|
|
|
+ MappingConfig config = mirrorDbConfig.getTableConfig().get(table);
|
|
|
|
|
|
if (config == null) {
|
|
|
return false;
|
|
@@ -108,10 +113,10 @@ public class RdbMirrorDbSyncService {
|
|
|
* @param baseConfigMap db sync config
|
|
|
* @param dml DML
|
|
|
*/
|
|
|
- private void initMappingConfig(String key, MappingConfig baseConfigMap, Dml dml) {
|
|
|
- MappingConfig mappingConfig = tableDbConfigCache.get(key);
|
|
|
+ private void initMappingConfig(String key, MappingConfig baseConfigMap, MirrorDbConfig mirrorDbConfig, Dml dml) {
|
|
|
+ MappingConfig mappingConfig = mirrorDbConfig.getTableConfig().get(key);
|
|
|
if (mappingConfig == null) {
|
|
|
- // 构造一个配置
|
|
|
+ // 构造表配置
|
|
|
mappingConfig = new MappingConfig();
|
|
|
mappingConfig.setDataSourceKey(baseConfigMap.getDataSourceKey());
|
|
|
mappingConfig.setDestination(baseConfigMap.getDestination());
|
|
@@ -129,7 +134,7 @@ public class RdbMirrorDbSyncService {
|
|
|
pkNames.forEach(pkName -> pkMapping.put(pkName, pkName));
|
|
|
dbMapping.setTargetPk(pkMapping);
|
|
|
|
|
|
- tableDbConfigCache.put(key, mappingConfig);
|
|
|
+ mirrorDbConfig.getTableConfig().put(key, mappingConfig);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -138,11 +143,11 @@ public class RdbMirrorDbSyncService {
|
|
|
*
|
|
|
* @param ddl DDL
|
|
|
*/
|
|
|
- private void executeDdl(Dml ddl) {
|
|
|
+ private void executeDdl(MirrorDbConfig mirrorDbConfig, Dml ddl) {
|
|
|
try (Connection conn = dataSource.getConnection(); Statement statement = conn.createStatement()) {
|
|
|
statement.execute(ddl.getSql());
|
|
|
// 移除对应配置
|
|
|
- tableDbConfigCache.remove(ddl.getDatabase() + "." + ddl.getDatabase() + "." + ddl.getTable());
|
|
|
+ mirrorDbConfig.getTableConfig().remove(ddl.getTable());
|
|
|
if (logger.isTraceEnabled()) {
|
|
|
logger.trace("Execute DDL sql: {} for database: {}", ddl.getSql(), ddl.getDatabase());
|
|
|
}
|