Bladeren bron

代码优化

donglang 2 maanden geleden
bovenliggende
commit
74decbf560

+ 18 - 1
iot-platform-common/src/main/java/com/platform/exception/GlobalExceptionHandler.java

@@ -6,6 +6,7 @@ import jakarta.servlet.http.HttpServletRequest;
 import jakarta.validation.ConstraintViolation;
 import jakarta.validation.ConstraintViolationException;
 import lombok.extern.slf4j.Slf4j;
+import org.mybatis.spring.MyBatisSystemException;
 import org.springframework.dao.DataAccessException;
 import org.springframework.util.CollectionUtils;
 import org.springframework.validation.BindingResult;
@@ -14,6 +15,7 @@ import org.springframework.web.bind.MethodArgumentNotValidException;
 import org.springframework.web.bind.annotation.ExceptionHandler;
 import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.bind.annotation.RestControllerAdvice;
+import org.springframework.web.servlet.resource.NoResourceFoundException;
 
 import java.util.Set;
 
@@ -67,12 +69,27 @@ public class GlobalExceptionHandler {
      * 场景:查询时序库时SQL错误、连接超时等
      */
     @ExceptionHandler({DataAccessException.class, java.sql.SQLException.class})
-    public BaseResult<Void> handleDbException(Exception e, HttpServletRequest request) {
+    public BaseResult<Void> handleDbException(DataAccessException e, HttpServletRequest request) {
         // 打印异常日志
         log.warn("数据库异常,请求路径:{}, 原因:{}", request.getRequestURI(), e.getMessage(), e);
         return BaseResult.error(ErrorCodeEnum.DB_OPERATE_FAIL.getCode(), "数据库操作失败,请稍后重试");
     }
 
+    // 处理 MyBatis 数据库相关异常
+    @ExceptionHandler(MyBatisSystemException.class)
+    public BaseResult<Void> handleMyBatisException(MyBatisSystemException e, HttpServletRequest request) {
+        log.warn("数据库操作失败,请求路径:{}, 原因:{}", request.getRequestURI(), e.getMessage(), e);
+        return BaseResult.error(ErrorCodeEnum.DB_OPERATE_FAIL.getCode(), "数据库操作失败,请稍后重试");
+    }
+
+    // 处理静态资源未找到异常
+    @ExceptionHandler(NoResourceFoundException.class)
+    public BaseResult<Void> handleNoResourceException(NoResourceFoundException e, HttpServletRequest request) {
+        log.warn("请求的资源不存在,请求路径:{}, 原因:{}", request.getRequestURI(), e.getMessage(), e);
+        return BaseResult.error(ErrorCodeEnum.DB_OPERATE_FAIL.getCode(), "请求的资源不存在,请稍后重试");
+    }
+
+
     /**
      * 处理系统通用异常(未被上述方法捕获的异常)
      * 场景:空指针、数组越界等未知错误

+ 10 - 16
iot-platform-manager/src/main/java/com/platform/api/manager/TransferVehicleManage.java

@@ -12,11 +12,9 @@ import com.platform.entity.VehicleData;
 import com.platform.entity.VehicleTimeSeriesData;
 import com.platform.enums.ErrorCodeEnum;
 import com.platform.exception.IotException;
-import com.platform.mapper.TaosMapper;
 import com.platform.service.TaosService;
 import com.platform.service.VehicleDataService;
 import jakarta.annotation.Resource;
-import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeansException;
 import org.springframework.context.ApplicationContext;
@@ -81,18 +79,14 @@ public class TransferVehicleManage implements ApplicationContextAware {
      */
     @Transactional(rollbackFor = Exception.class)
     public void batchSaveVehicle(List<VehicleDataSaveRequest> vehicleDataList) {
-        try {
-            List<VehicleData> newVehicles = checkVehicle(vehicleDataList);
-            // 批量保存到关系库
-            if (CollectionUtils.isNotEmpty(newVehicles)) {
-                vehicleDataService.saveBatch(newVehicles);
-            }
-
-            // 批量保存到时序数据库
-            taosService.batchInsertVehicleData(vehicleDataList);
-        } catch (Exception e) {
-            throw new IotException(ErrorCodeEnum.TD_SAVE_FAIL, "批量保存车辆数据到时序数据库失败", e);
+        List<VehicleData> newVehicles = checkVehicle(vehicleDataList);
+        // 批量保存到关系库
+        if (CollectionUtils.isNotEmpty(newVehicles)) {
+            vehicleDataService.saveBatch(newVehicles);
         }
+
+        // 批量保存到时序数据库
+        taosService.batchInsertVehicleData(vehicleDataList);
     }
 
     /**
@@ -124,12 +118,12 @@ public class TransferVehicleManage implements ApplicationContextAware {
     /**
      * 定时兜底任务:每10分钟执行一次,防止数据长期凑不满10条
      */
-    @Scheduled(fixedRate = 600 * 1000)
-    @Transactional(rollbackFor = Exception.class)
+    @Scheduled(fixedRate = 6 * 1000)
     public void scheduledBatchSave() {
         List<VehicleDataSaveRequest> remainingData = vehicleDataQueue.takeAll();
         if (!remainingData.isEmpty()) {
-            batchSaveVehicle(remainingData);
+            TransferVehicleManage proxy = applicationContext.getBean(TransferVehicleManage.class);
+            proxy.batchSaveVehicle(remainingData);
         }
     }
 

+ 11 - 1
iot-platform-manager/src/main/java/com/platform/mapper/TaosMapper.java

@@ -1,6 +1,6 @@
 package com.platform.mapper;
 
-
+import com.baomidou.dynamic.datasource.annotation.DS;
 import com.platform.api.request.VehicleDataSaveRequest;
 import com.platform.entity.VehicleTimeSeriesData;
 import org.apache.ibatis.annotations.Mapper;
@@ -17,14 +17,24 @@ import java.util.List;
  */
 
 @Mapper
+@DS("td")
 public interface TaosMapper {
 
+
+    /**
+     * 插入车辆数据超级表
+     * @return 插入成功的行数
+     */
+    @DS("td")
+    int createVehicleDataTable();
+
     /**
      * 插入车辆数据到时序子表
      * 子表名规则:vehicle_${tenantId}_${deviceId}(基于租户ID+设备ID,确保唯一)
      * @param vehicleDataList 车辆数据实体
      * @return 插入成功的行数
      */
+    @DS("td")
     int batchInsertVehicleData(List<VehicleDataSaveRequest> vehicleDataList);
 
     /**

+ 10 - 1
iot-platform-manager/src/main/java/com/platform/service/impl/TaosServiceImpl.java

@@ -6,10 +6,12 @@ import com.platform.api.request.VehicleDataSaveRequest;
 import com.platform.entity.VehicleTimeSeriesData;
 import com.platform.mapper.TaosMapper;
 import com.platform.service.TaosService;
+import com.zaxxer.hikari.HikariConfig;
 import jakarta.annotation.Resource;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.sql.Connection;
 import java.util.List;
 
 /**
@@ -33,7 +35,14 @@ public class TaosServiceImpl implements TaosService {
      */
     @Override
     public int batchInsertVehicleData(List<VehicleDataSaveRequest> vehicleDataList) {
-        return taosMapper.batchInsertVehicleData(vehicleDataList);
+         try {
+             //
+             taosMapper.createVehicleDataTable();
+             return taosMapper.batchInsertVehicleData(vehicleDataList);
+         } catch (Exception e) {
+             e.printStackTrace();
+         }
+         return 0;
     }
 
     /**

+ 23 - 19
iot-platform-manager/src/main/resources/mapper/TaosMapper.xml

@@ -5,31 +5,35 @@
 <mapper namespace="com.platform.mapper.TaosMapper">
 
 
+    <!-- 创建车辆数据子表-->
+    <!-- 创建超级表 -->
+    <update id="createVehicleDataTable">
+        CREATE STABLE IF NOT EXISTS vehicle_data (
+            ts TIMESTAMP,
+            longitude DOUBLE,
+            latitude DOUBLE,
+            speed FLOAT,
+            direction TINYINT UNSIGNED,
+            fuel_level FLOAT,
+            mileage DOUBLE,
+            engine_temp SMALLINT,
+            battery_voltage FLOAT,
+            status INT,
+            alarm_code INT,
+            w_order_no NCHAR(50)
+        ) TAGS (
+            car_no NCHAR(20)
+        )
+    </update>
+
+
+
     <!-- 创建车辆数据子表-->
     <update id="createVehicleDataSubTable">
         CREATE TABLE IF NOT EXISTS vehicle_data_${carNo} USING vehicle_data
             TAGS (#{car_no})
     </update>
 
-<!--    &lt;!&ndash; 插入车辆数据子表数据&ndash;&gt;-->
-<!--    <insert id="batchInsertVehicleData">-->
-<!--        INSERT INTO vehicle_data_${carNo}} USING vehicle_data-->
-<!--        VALUES (-->
-<!--            #{data.ts},-->
-<!--            #{data.longitude},-->
-<!--            #{data.latitude},-->
-<!--            #{data.speed},-->
-<!--            #{data.direction},-->
-<!--            #{data.fuelLevel},-->
-<!--            #{data.mileage},-->
-<!--            #{data.engineTemp},-->
-<!--            #{data.batteryVoltage},-->
-<!--            #{data.status},-->
-<!--            #{data.wOrderNo},-->
-<!--            #{data.alarmCode}-->
-<!--            )-->
-<!--    </insert>-->
-
     <!-- 批量插入车辆数据时序数据库子表 -->
     <insert id="batchInsertVehicleData">
         INSERT INTO

+ 10 - 0
pom.xml

@@ -88,6 +88,13 @@
             <version>1.18.30</version>
         </dependency>
 
+        <!-- 动态数据源依赖 -->
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
+            <version>3.5.2</version> <!-- 最新稳定版 -->
+        </dependency>
+
         <!-- TDengine 官方 Java 驱动 -->
         <dependency>
             <groupId>com.taosdata.jdbc</groupId>
@@ -112,6 +119,9 @@
         </dependency>
 
 
+
+
+
     </dependencies>
 	<dependencyManagement>
 		<dependencies>