diff --git a/springboot-backend/src/main/java/com/admin/controller/FlowController.java b/springboot-backend/src/main/java/com/admin/controller/FlowController.java index f95410e..a192e07 100644 --- a/springboot-backend/src/main/java/com/admin/controller/FlowController.java +++ b/springboot-backend/src/main/java/com/admin/controller/FlowController.java @@ -53,6 +53,7 @@ public class FlowController extends BaseController { // 用于同步相同用户和隧道的流量更新操作 private static final ConcurrentHashMap USER_LOCKS = new ConcurrentHashMap<>(); private static final ConcurrentHashMap TUNNEL_LOCKS = new ConcurrentHashMap<>(); + private static final ConcurrentHashMap FORWARD_LOCKS = new ConcurrentHashMap<>(); @RequestMapping("/test") @@ -147,7 +148,6 @@ public class FlowController extends BaseController { if (tunnel != null){ BigDecimal trafficRatio = tunnel.getTrafficRatio(); for (FlowDto flowDto : flowDataList) { - System.out.println(flowDto); BigDecimal originalD = BigDecimal.valueOf(flowDto.getD()); BigDecimal originalU = BigDecimal.valueOf(flowDto.getU()); @@ -156,7 +156,6 @@ public class FlowController extends BaseController { flowDto.setD(newD.longValue()); flowDto.setU(newU.longValue()); - System.out.println(flowDto); } } } @@ -214,12 +213,15 @@ public class FlowController extends BaseController { * 更新转发流量统计 - 使用原子操作避免并发问题 */ private boolean updateForwardFlow(String forwardId, FlowStatistics flowStats) { - UpdateWrapper updateWrapper = new UpdateWrapper<>(); - updateWrapper.eq("id", forwardId); - updateWrapper.setSql("in_flow = in_flow + " + flowStats.getDownload()); - updateWrapper.setSql("out_flow = out_flow + " + flowStats.getUpload()); + // 对相同转发的流量更新进行同步,避免并发覆盖 + synchronized (getForwardLock(forwardId)) { + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.eq("id", forwardId); + updateWrapper.setSql("in_flow = in_flow + " + flowStats.getDownload()); + updateWrapper.setSql("out_flow = out_flow + " + flowStats.getUpload()); - return forwardService.update(null, updateWrapper); + return forwardService.update(null, updateWrapper); + } } /** @@ -498,6 +500,13 @@ public class FlowController extends BaseController { return TUNNEL_LOCKS.computeIfAbsent(userTunnelId, k -> new Object()); } + /** + * 获取转发锁对象 + */ + private Object getForwardLock(String forwardId) { + return FORWARD_LOCKS.computeIfAbsent(forwardId, k -> new Object()); + } + /** * 流量统计数据类 */ diff --git a/vue-frontend/src/views/Tunnel.vue b/vue-frontend/src/views/Tunnel.vue index 52435f2..54a8876 100644 --- a/vue-frontend/src/views/Tunnel.vue +++ b/vue-frontend/src/views/Tunnel.vue @@ -33,16 +33,6 @@
端口转发 隧道转发 - - {{ tunnel.protocol.toUpperCase() }} - - 单向计算 - 双向计算 - - {{ tunnel.trafficRatio }}x倍率 -