Browse Source

优化数据入库,改为批量插入

wukai 8 months ago
parent
commit
4e1abcfff0

+ 1 - 1
ruoyi-admin/src/main/java/com/ruoyi/biz/service/impl/TaskServiceImpl.java

@@ -185,10 +185,10 @@ public class TaskServiceImpl implements ITaskService {
             }
         }
 
-        Date d = new Date();
         dbProcess(endTime, calcHours, stopList, alarmsList, panList);
         stopService.process(ldt, list);
         alarmsService.process(ldt, list);
+        Date d = new Date();
 //        Date s_time = Date.from(ldt.toLocalDate().atStartOfDay(ZoneOffset.of("+8")).toInstant());
 //        Date e_time=Date.
         log.info("总共消耗:{}ms", d.getTime() - s.getTime());

+ 32 - 4
ruoyi-admin/src/main/java/com/ruoyi/biz/service/impl/TwinCalcAlarmsServiceImpl.java

@@ -9,6 +9,9 @@ import com.ruoyi.biz.service.ITwinRecordAlarmsService;
 import com.ruoyi.common.core.text.Convert;
 import com.ruoyi.common.utils.bean.BeanUtils;
 import com.ruoyi.system.service.ISysConfigService;
+import org.apache.ibatis.session.ExecutorType;
+import org.apache.ibatis.session.SqlSession;
+import org.apache.ibatis.session.SqlSessionFactory;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
@@ -31,6 +34,8 @@ public class TwinCalcAlarmsServiceImpl implements ITwinCalcAlarmsService {
     private ITwinRecordAlarmsService alarmsService;
     @Resource
     private ISysConfigService configService;
+    @Resource
+    private SqlSessionFactory factory;
 
     /**
      * 查询告警数据统计
@@ -111,6 +116,8 @@ public class TwinCalcAlarmsServiceImpl implements ITwinCalcAlarmsService {
 
         Date date = Date.from(startTime.toLocalDate().atStartOfDay(ZoneOffset.of("+8")).toInstant());
         String oldStr = "old";
+        List<TwinCalcAlarms> insertList = new ArrayList<>();
+        List<TwinCalcAlarms> updateList = new ArrayList<>();
         deviceList.forEach(device -> {
             //先处理上次未统计完整的数据
             TwinCalcAlarms calcSearch = new TwinCalcAlarms();
@@ -167,17 +174,38 @@ public class TwinCalcAlarmsServiceImpl implements ITwinCalcAlarmsService {
                 }
             }
 
-            recordList.forEach(stop -> {
+//            recordList.forEach(stop -> {
+//                TwinCalcAlarms v = new TwinCalcAlarms();
+//                BeanUtils.copyProperties(stop, v);
+//                if (oldStr.equals(stop.getRemark())) {
+//                    updateTwinCalcAlarms(v);
+//                } else {
+//                    v.setId(null);
+//                    insertTwinCalcAlarms(v);
+//                }
+//            });
+
+
+            for (TwinRecordAlarms stop : recordList) {
                 TwinCalcAlarms v = new TwinCalcAlarms();
                 BeanUtils.copyProperties(stop, v);
                 if (oldStr.equals(stop.getRemark())) {
-                    updateTwinCalcAlarms(v);
+                    updateList.add(v);
+//                    updateTwinCalcStop(v);
                 } else {
                     v.setId(null);
-                    insertTwinCalcAlarms(v);
+                    insertList.add(v);
+//                    insertTwinCalcStop(v);
                 }
-            });
+            }
+
         });
+        try (SqlSession sqlSession = factory.openSession(ExecutorType.BATCH, false)) {
+            TwinCalcAlarmsMapper mapper = sqlSession.getMapper(TwinCalcAlarmsMapper.class);
+            insertList.forEach(mapper::insertTwinCalcAlarms);
+            updateList.forEach(mapper::updateTwinCalcAlarms);
+            sqlSession.commit();
+        }
     }
 
     /**

+ 20 - 4
ruoyi-admin/src/main/java/com/ruoyi/biz/service/impl/TwinCalcStopServiceImpl.java

@@ -9,6 +9,9 @@ import com.ruoyi.biz.service.ITwinRecordStopService;
 import com.ruoyi.common.core.text.Convert;
 import com.ruoyi.common.utils.bean.BeanUtils;
 import com.ruoyi.system.service.ISysConfigService;
+import org.apache.ibatis.session.ExecutorType;
+import org.apache.ibatis.session.SqlSession;
+import org.apache.ibatis.session.SqlSessionFactory;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
@@ -33,6 +36,8 @@ public class TwinCalcStopServiceImpl implements ITwinCalcStopService {
 
     @Resource
     private ITwinRecordStopService stopService;
+    @Resource
+    private SqlSessionFactory factory;
 
     /**
      * 查询停机数据统计
@@ -112,6 +117,8 @@ public class TwinCalcStopServiceImpl implements ITwinCalcStopService {
         int legalTime = Integer.parseInt(config) * 1000;
 
         Date date = Date.from(startTime.toLocalDate().atStartOfDay(ZoneOffset.of("+8")).toInstant());
+        List<TwinCalcStop> insertList = new ArrayList<>();
+        List<TwinCalcStop> updateList = new ArrayList<>();
         String oldStr = "old";
         deviceList.forEach(device -> {
             //先处理上次未统计完整的数据
@@ -169,17 +176,26 @@ public class TwinCalcStopServiceImpl implements ITwinCalcStopService {
                 }
             }
 
-            recordList.forEach(stop -> {
+            for (TwinRecordStop stop : recordList) {
                 TwinCalcStop v = new TwinCalcStop();
                 BeanUtils.copyProperties(stop, v);
                 if (oldStr.equals(stop.getRemark())) {
-                    updateTwinCalcStop(v);
+                    updateList.add(v);
+//                    updateTwinCalcStop(v);
                 } else {
                     v.setId(null);
-                    insertTwinCalcStop(v);
+                    insertList.add(v);
+//                    insertTwinCalcStop(v);
                 }
-            });
+            }
         });
+
+        try (SqlSession sqlSession = factory.openSession(ExecutorType.BATCH, false)) {
+            TwinCalcStopMapper mapper = sqlSession.getMapper(TwinCalcStopMapper.class);
+            insertList.forEach(mapper::insertTwinCalcStop);
+            updateList.forEach(mapper::updateTwinCalcStop);
+            sqlSession.commit();
+        }
     }
 
     /**

+ 61 - 0
ruoyi-admin/src/main/resources/application-prod.yml

@@ -0,0 +1,61 @@
+# 数据源配置
+spring:
+  datasource:
+    type: com.alibaba.druid.pool.DruidDataSource
+    driverClassName: com.mysql.cj.jdbc.Driver
+    druid:
+      # 主库数据源
+      master:
+        url: jdbc:mysql://192.168.66.133:3306/digital_twin?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT
+        username: root
+        password: Twin@2024.
+      # 从库数据源
+      slave:
+        # 从数据源开关/默认关闭
+        enabled: false
+        url:
+        username:
+        password:
+      # 初始连接数
+      initialSize: 5
+      # 最小连接池数量
+      minIdle: 10
+      # 最大连接池数量
+      maxActive: 20
+      # 配置获取连接等待超时的时间
+      maxWait: 60000
+      # 配置连接超时时间
+      connectTimeout: 30000
+      # 配置网络超时时间
+      socketTimeout: 60000
+      # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
+      timeBetweenEvictionRunsMillis: 60000
+      # 配置一个连接在池中最小生存的时间,单位是毫秒
+      minEvictableIdleTimeMillis: 300000
+      # 配置一个连接在池中最大生存的时间,单位是毫秒
+      maxEvictableIdleTimeMillis: 900000
+      # 配置检测连接是否有效
+      validationQuery: SELECT 1 FROM DUAL
+      testWhileIdle: true
+      testOnBorrow: false
+      testOnReturn: false
+      webStatFilter:
+        enabled: true
+      statViewServlet:
+        enabled: true
+        # 设置白名单,不填则允许所有访问
+        allow:
+        url-pattern: /druid/*
+        # 控制台管理用户名和密码
+        login-username: admin
+        login-password: 123456
+      filter:
+        stat:
+          enabled: true
+          # 慢SQL记录
+          log-slow-sql: true
+          slow-sql-millis: 1000
+          merge-sql: true
+        wall:
+          config:
+            multi-statement-allow: true

+ 7 - 7
ruoyi-admin/src/main/resources/logback.xml

@@ -11,7 +11,7 @@
 			<pattern>${log.pattern}</pattern>
 		</encoder>
 	</appender>
-	
+
 	<!-- 系统日志输出 -->
 	<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
 	    <file>${log.path}/sys-info.log</file>
@@ -34,7 +34,7 @@
             <onMismatch>DENY</onMismatch>
         </filter>
 	</appender>
-	
+
 	<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
 	    <file>${log.path}/sys-error.log</file>
         <!-- 循环政策:基于时间创建日志文件 -->
@@ -56,7 +56,7 @@
             <onMismatch>DENY</onMismatch>
         </filter>
     </appender>
-	
+
 	<!-- 用户访问日志输出  -->
     <appender name="sys-user" class="ch.qos.logback.core.rolling.RollingFileAppender">
 		<file>${log.path}/sys-user.log</file>
@@ -70,7 +70,7 @@
             <pattern>${log.pattern}</pattern>
         </encoder>
     </appender>
-	
+
 	<!-- 系统模块日志级别控制  -->
 	<logger name="com.ruoyi" level="info" />
 	<!-- Spring日志级别控制  -->
@@ -79,15 +79,15 @@
 	<root level="info">
 		<appender-ref ref="console" />
 	</root>
-	
+
 	<!--系统操作日志-->
     <root level="info">
         <appender-ref ref="file_info" />
         <appender-ref ref="file_error" />
     </root>
-	
+
 	<!--系统用户操作日志-->
     <logger name="sys-user" level="info">
         <appender-ref ref="sys-user"/>
     </logger>
-</configuration> 
+</configuration>

+ 1 - 1
ruoyi-admin/src/main/resources/templates/biz/data/data.html

@@ -13,7 +13,7 @@
         <div class="input-group date">
             <input id="date" name="date" class="time-input" placeholder="日期" type="text">&nbsp;
             <input type="number" id="sp" placeholder="开始时段" min="0" max="23" step="1" value="1"/> 至
-            <input type="number" id="ep" placeholder="结束时段" min="0" max="12" step="1" value="1"/>
+            <input type="number" id="ep" placeholder="结束时段" min="0" max="23" step="1" value="1"/>
         </div>
     </div>
     <label class="col-sm-2 control-label">

+ 2 - 0
ruoyi-admin/src/test/java/com/jjt/DeviceTest.java

@@ -7,6 +7,7 @@ import com.ruoyi.biz.service.IIotService;
 import org.junit.jupiter.api.Test;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.test.context.ActiveProfiles;
 
 import javax.annotation.Resource;
 
@@ -17,6 +18,7 @@ import javax.annotation.Resource;
  * @date 2024/5/7 11:49
  */
 @SpringBootTest(classes = RuoYiApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+@ActiveProfiles("prod")
 public class DeviceTest {
     @Resource
     private JdbcTemplate jdbcTemplate;