Commit 9d8042ad authored by 黎博's avatar 黎博

优化

parent 3a042fc0
......@@ -7,6 +7,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
@Slf4j
......@@ -33,11 +34,12 @@ public class DbSyncController {
@GetMapping("/one")
public JsonResult syncSingleTable(@RequestParam String namespace, @RequestParam String dbName, @RequestParam String tableName) {
try {
long startTime = System.currentTimeMillis();
Map<String, String> map = databaseSyncService.getMysqlInfoByNamespace(namespace);
String destIp = map.get("ip");
String destPort = map.get("port");
log.info("获取到{}环境的Mysql地址为:{}", namespace, destIp + ":" + destPort);
if (tableName.equalsIgnoreCase("all")) {
if (tableName.equalsIgnoreCase("all") || tableName.equals("")) {
log.info("开始同步{}库下所有的表", dbName);
databaseSyncService.getDbInfoFromSource(ip, port, username, password, dbName);
databaseSyncService.syncDbToDest(destIp, destPort, "qa", "qatest", dbName);
......@@ -46,7 +48,9 @@ public class DbSyncController {
databaseSyncService.getSingleTableFromSource(ip, port, username, password, dbName, tableName);
databaseSyncService.syncSingleTableToDest(destIp, destPort, "qa", "qatest", dbName, tableName);
}
return JsonResult.buildSuccessResult("同步成功!");
long endTime = System.currentTimeMillis();
long elapsedTime = (endTime - startTime) / 1000;
return JsonResult.buildSuccessResult(elapsedTime + "s");
} catch (Exception e) {
e.printStackTrace();
return JsonResult.buildErrorStateResult("同步失败!", false);
......@@ -70,6 +74,8 @@ public class DbSyncController {
*/
@GetMapping("/tables")
public JsonResult getTableList(@RequestParam String dbName) {
return JsonResult.buildSuccessResult(databaseSyncService.getTableListByDb(ip, port, username, password, dbName));
List<Object> tableList = databaseSyncService.getTableListByDb(ip, port, username, password, dbName);
tableList.add(0, "all");
return JsonResult.buildSuccessResult(tableList);
}
}
......@@ -30,6 +30,12 @@ public class DatabaseSyncServiceImpl implements DatabaseSyncService {
@Value("${cash_loan_flow.sql}")
private String cashLoanFlowSql;
@Value("${contract.sql}")
private String contractSql;
@Value("${payment_center.sql}")
private String paymentCenterSql;
private final String dbSyncPrefix = "dbsync:";
/**
......@@ -156,6 +162,7 @@ public class DatabaseSyncServiceImpl implements DatabaseSyncService {
public boolean syncDbToDest(String ip, String port, String username, String password, String dbName) {
String driver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://" + ip + ":" + port;
String createTableKey = dbSyncPrefix + dbName + ":create" ;
String insertTableKey = dbSyncPrefix + dbName + ":insert";
String dbRedisKey = dbSyncPrefix + dbName;
......@@ -176,7 +183,7 @@ public class DatabaseSyncServiceImpl implements DatabaseSyncService {
// 重新创建数据库
String createDbSql = redisUtils.get(dbRedisKey).toString();
log.info("创建数据库:{}", createDbSql);
log.info("重新创建数据库:{}", createDbSql);
preparedStatement = connection.prepareStatement(createDbSql);
preparedStatement.execute();
connection.close();
......@@ -188,25 +195,48 @@ public class DatabaseSyncServiceImpl implements DatabaseSyncService {
// 从redis中获取要同步的表结构
List<Object> createTableRedisValue = redisUtils.lGet(createTableKey, 0, redisUtils.lGetListSize(createTableKey));
Statement statement = newConnection.createStatement();
log.info("开始同步表结构!");
long structureStartTime = System.currentTimeMillis();
for (Object sql: createTableRedisValue) {
statement.addBatch(sql.toString());
}
statement.executeBatch();
statement.clearBatch();
long structureEndTime = System.currentTimeMillis();
log.info("表结构同步完成,共花费{}秒", (structureEndTime - structureStartTime) / 1000);
// 从redis中同步表数据
String insertTableRedisValue = redisUtils.get(insertTableKey).toString();
log.info("开始同步表数据!");
long dataStartTime = System.currentTimeMillis();
for (String insertSql: insertTableRedisValue.split("\n")) {
statement.addBatch(insertSql);
}
statement.executeBatch();
statement.clearBatch();
log.info("表数据同步完成!");
long dataEndTime = System.currentTimeMillis();
log.info("表数据同步完成,共花费{}秒", (dataEndTime - dataStartTime) / 1000);
// 判断是否需要update
if (dbName.equals("cash_loan_flow")) {
for (String sql: cashLoanFlowSql.split("\n")) {
log.info(sql);
log.info("执行update sql: {}", sql);
statement.addBatch(sql);
}
statement.executeBatch();
statement.clearBatch();
}
if (dbName.equals("contract")) {
for (String sql: contractSql.split("\n")) {
log.info("执行update sql: {}", sql);
statement.addBatch(sql);
}
statement.executeBatch();
statement.clearBatch();
}
if (dbName.equals("payment_center")) {
for (String sql: paymentCenterSql.split("\n")) {
log.info("执行update sql: {}", sql);
statement.addBatch(sql);
}
statement.executeBatch();
......@@ -258,7 +288,7 @@ public class DatabaseSyncServiceImpl implements DatabaseSyncService {
preparedStatement = connection.prepareStatement(sql);
ResultSet resultSet = preparedStatement.executeQuery();
while (resultSet.next()) {
redisUtils.set(tableCreateKey, resultSet.getString(2));
redisUtils.set(tableCreateKey, resultSet.getString(2), 600);
}
}
......@@ -292,7 +322,7 @@ public class DatabaseSyncServiceImpl implements DatabaseSyncService {
insertSql = insertSql + "\n";
insertRedisValue += insertSql;
}
redisUtils.set(tableInsertKey, insertRedisValue);
redisUtils.set(tableInsertKey, insertRedisValue, 600);
}
} catch (Exception e) {
e.printStackTrace();
......@@ -346,6 +376,7 @@ public class DatabaseSyncServiceImpl implements DatabaseSyncService {
statement.addBatch(insertSql);
}
statement.executeBatch();
statement.clearBatch();
connection.commit();
} catch (Exception e) {
e.printStackTrace();
......@@ -434,7 +465,6 @@ public class DatabaseSyncServiceImpl implements DatabaseSyncService {
params.put("serviceName", "mysql");
params.put("type", "base");
String response = HttpClientUtils.doPostJson(tkeHost + "/service/details", headers, JSON.toJSONString(params));
log.info(response);
String mysqlIp = JsonPath.read(response, "$.data.lanIp").toString();
String mysqlPort = JsonPath.read(response, "$.data.portMappings[0].nodePort").toString();
Map<String, String> result = new HashMap<>();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment