新增MySQL和pg数据库的同步

This commit is contained in:
2025-08-27 14:48:00 +08:00
parent 984d19bbb4
commit 78957096f6
3 changed files with 59 additions and 54 deletions

View File

@@ -192,7 +192,6 @@ public class taskDbSync {
private String mapMySqlTypeToPgType(String mySqlType, int columnSize, int decimalDigits) {
// 统一转为大写处理,避免类型字符串大小写问题
String type = mySqlType.toUpperCase();
return switch (type) {
// 整数类型映射
case "INT", "INTEGER" -> "INTEGER";
@@ -200,7 +199,6 @@ public class taskDbSync {
case "SMALLINT" -> "SMALLINT";
case "MEDIUMINT" -> "INTEGER"; // PostgresSQL无MEDIUMINT用INTEGER兼容
case "BIGINT" -> "BIGINT";
// 浮点类型映射
case "FLOAT" -> columnSize > 24 ? "DOUBLE PRECISION" : "REAL"; // FLOAT(24)以下映射为REAL
case "DOUBLE", "DOUBLE PRECISION" -> "DOUBLE PRECISION";
@@ -209,7 +207,6 @@ public class taskDbSync {
int scale = Math.max(decimalDigits, 0);
yield "NUMERIC(" + precision + "," + scale + ")";
}
// 字符串类型映射
case "VARCHAR" -> {
// PostgresSQL VARCHAR无长度限制时建议用TEXT
@@ -219,30 +216,25 @@ public class taskDbSync {
case "CHAR" -> "CHAR(" + (columnSize > 0 ? columnSize : 1) + ")";
case "TEXT", "MEDIUMTEXT", "TINYTEXT" -> "TEXT";
case "LONGTEXT" -> "TEXT"; // PostgresSQL TEXT无长度限制
// 二进制类型映射
case "BLOB" -> "BYTEA";
case "TINYBLOB", "MEDIUMBLOB", "LONGBLOB" -> "BYTEA";
case "BINARY" -> "BYTEA";
case "VARBINARY" -> "BYTEA";
// 日期时间类型映射
case "DATE" -> "DATE";
case "TIME" -> "TIME";
case "DATETIME", "TIMESTAMP" -> "TIMESTAMP";
case "YEAR" -> "SMALLINT"; // YEAR用SMALLINT存储更高效
// 特殊类型映射
case "BOOLEAN" -> "BOOLEAN";
case "JSON", "JSONB" -> "JSONB"; // PostgresSQL推荐用JSONB
case "ENUM" -> "VARCHAR(255)"; // ENUM转为字符串存储需业务层保证合法性
case "SET" -> "TEXT"; // SET用TEXT存储逗号分隔
// 几何类型(简化映射)
case "POINT" -> "POINT";
case "LINESTRING" -> "LINESTRING";
case "POLYGON" -> "POLYGON";
// 未匹配类型的默认处理
default -> {
// 日志输出未匹配的类型,便于后续优化

View File

@@ -46,7 +46,10 @@ public class taskEnable {
*/
@GetMapping("/getTaskDockerDiskInfo")
public ApiResult<?> jobHostDisk(String token) {
if (vToken.isValidToken(token)) {
if (!vToken.isValidToken(token)) {
return ApiResult.error(401, "无效的访问令牌");
}
try {
List<DockerHost> dockerHosts = dockerHostService.list();
List<String> errorList = Collections.synchronizedList(new ArrayList<>());
// 并行处理所有宿主机
@@ -58,8 +61,9 @@ public class taskEnable {
return errorList.isEmpty()
? ApiResult.success()
: ApiResult.error();
} catch (Exception e) {
return ApiResult.error(101, e.getMessage());
}
return ApiResult.error();
}

View File

@@ -255,7 +255,11 @@ public class sysController {
@GetMapping("/getApiInfo")
public ApiResult<List<SnapshotDTO>> getApiInfo(String token) {
if (vToken.isValidToken(token)) {
if (!vToken.isValidToken(token)) {
return ApiResult.error(401, "无效的访问令牌");
}
try {
// 1. 新建一个一次性 List
List<HostRuntime.Snapshot> snapshots =
Collections.synchronizedList(new LinkedList<>());
@@ -267,8 +271,9 @@ public class sysController {
((LinkedList<HostRuntime.Snapshot>) snapshots).removeFirst();
}
return ApiResult.success(Collections.singletonList(SnapshotDTO.from(snap)));
} catch (Exception e) {
return ApiResult.error(101, e.getMessage());
}
return ApiResult.error();
}
@@ -277,7 +282,10 @@ public class sysController {
*/
@GetMapping("/getApiDockerInfo")
public ApiResult<?> getDockerInfo(String token) {
if (vToken.isValidToken(token)) {
if (!vToken.isValidToken(token)) {
return ApiResult.error(401, "无效的访问令牌");
}
try {
List<DockerHost> dockerHosts = dockerHostService.list();
List<String> errorList = Collections.synchronizedList(new ArrayList<>());
CompletableFuture<?>[] futures = dockerHosts.stream()
@@ -289,8 +297,9 @@ public class sysController {
return errorList.isEmpty()
? ApiResult.success()
: ApiResult.error();
} catch (Exception e) {
return ApiResult.error(101, e.getMessage());
}
return ApiResult.error();
}
@@ -299,29 +308,29 @@ public class sysController {
*/
@GetMapping("/getApiStartDockerInfo")
public ApiResult<?> startDockerInfo(String id, String token) {
if (vToken.isValidToken(token)) {
if (!vToken.isValidToken(token)) {
return ApiResult.error(401, "无效的访问令牌");
}
try {
DockerContainerInfo cur = dockerInfoService.getById(id);
DockerHost host = dockerHostService.getById(cur.getDokerHostId());
try {
SshUser sshUser = sshUserService.getById(host.getUserId());
SshInfo sshInfo = sshInfoService.getById(host.getHostId());
docker.startDocker(sshInfo.getHostIp(), Long.valueOf(sshInfo.getHostPort()), sshUser.getCUsername(), sshUser.getCPassword(), cur.getContainerId());
/* 2. 取回最新列表 */
List<docker.DockerInfo> remoteList = docker.getDockerInfo(
sshInfo.getHostIp(),
Long.valueOf(sshInfo.getHostPort()),
sshUser.getCUsername(),
sshUser.getCPassword());
/* 3. 有则更新、无则插入、失效删除 */
refreshContainerTable(cur.getDokerHostId(), remoteList, sshInfo);
/* 4. 更新主机运行数 */
updateRunNum(host, remoteList);
return ApiResult.success();
} catch (Exception e) {
System.out.println(e.getMessage());
}
SshUser sshUser = sshUserService.getById(host.getUserId());
SshInfo sshInfo = sshInfoService.getById(host.getHostId());
docker.startDocker(sshInfo.getHostIp(), Long.valueOf(sshInfo.getHostPort()), sshUser.getCUsername(), sshUser.getCPassword(), cur.getContainerId());
/* 2. 取回最新列表 */
List<docker.DockerInfo> remoteList = docker.getDockerInfo(
sshInfo.getHostIp(),
Long.valueOf(sshInfo.getHostPort()),
sshUser.getCUsername(),
sshUser.getCPassword());
/* 3. 有则更新、无则插入、失效删除 */
refreshContainerTable(cur.getDokerHostId(), remoteList, sshInfo);
/* 4. 更新主机运行数 */
updateRunNum(host, remoteList);
return ApiResult.success();
} catch (Exception e) {
return ApiResult.error(101, e.getMessage());
}
return ApiResult.error();
}
@@ -330,29 +339,29 @@ public class sysController {
*/
@GetMapping("/getApiStopDockerInfo")
public ApiResult<?> stopDockerInfo(String id, String token) {
if (vToken.isValidToken(token)) {
if (!vToken.isValidToken(token)) {
return ApiResult.error(401, "无效的访问令牌");
}
try {
DockerContainerInfo cur = dockerInfoService.getById(id);
DockerHost host = dockerHostService.getById(cur.getDokerHostId());
try {
SshUser sshUser = sshUserService.getById(host.getUserId());
SshInfo sshInfo = sshInfoService.getById(host.getHostId());
docker.stopDocker(sshInfo.getHostIp(), Long.valueOf(sshInfo.getHostPort()), sshUser.getCUsername(), sshUser.getCPassword(), cur.getContainerId());
/* 2. 取回最新列表 */
List<docker.DockerInfo> remoteList = docker.getDockerInfo(
sshInfo.getHostIp(),
Long.valueOf(sshInfo.getHostPort()),
sshUser.getCUsername(),
sshUser.getCPassword());
/* 3. 有则更新、无则插入、失效删除 */
refreshContainerTable(cur.getDokerHostId(), remoteList, sshInfo);
/* 4. 更新主机运行数 */
updateRunNum(host, remoteList);
return ApiResult.success();
} catch (Exception e) {
System.out.println(e.getMessage());
}
SshUser sshUser = sshUserService.getById(host.getUserId());
SshInfo sshInfo = sshInfoService.getById(host.getHostId());
docker.stopDocker(sshInfo.getHostIp(), Long.valueOf(sshInfo.getHostPort()), sshUser.getCUsername(), sshUser.getCPassword(), cur.getContainerId());
/* 2. 取回最新列表 */
List<docker.DockerInfo> remoteList = docker.getDockerInfo(
sshInfo.getHostIp(),
Long.valueOf(sshInfo.getHostPort()),
sshUser.getCUsername(),
sshUser.getCPassword());
/* 3. 有则更新、无则插入、失效删除 */
refreshContainerTable(cur.getDokerHostId(), remoteList, sshInfo);
/* 4. 更新主机运行数 */
updateRunNum(host, remoteList);
return ApiResult.success();
} catch (Exception e) {
return ApiResult.error(101, e.getMessage());
}
return ApiResult.error();
}