Преглед на файлове

修改access数据库读取方式, sqlite数据库读取位置,不记录响应数据

lamphua преди 1 месец
родител
ревизия
c9a3995a20
променени са 13 файла, в които са добавени 135 реда и са изтрити 148 реда
  1. 1
    1
      cmc-temperature-back/cmc-monitoring/src/main/java/com/ruoyi/monitoring/mapper/CmcChannelMapper.java
  2. 1
    1
      cmc-temperature-back/cmc-monitoring/src/main/java/com/ruoyi/monitoring/mapper/CmcTemperatureMapper.java
  3. 0
    18
      cmc-temperature-back/cmc-monitoring/src/main/java/com/ruoyi/monitoring/mapper/access/AccessChannelMapper.java
  4. 0
    16
      cmc-temperature-back/cmc-monitoring/src/main/java/com/ruoyi/monitoring/mapper/access/AccessDataMapper.java
  5. 1
    1
      cmc-temperature-back/cmc-monitoring/src/main/java/com/ruoyi/monitoring/service/IAccessSyncService.java
  6. 88
    42
      cmc-temperature-back/cmc-monitoring/src/main/java/com/ruoyi/monitoring/service/impl/AccessSyncServiceImpl.java
  7. 0
    31
      cmc-temperature-back/cmc-monitoring/src/main/resources/mapper/access/AccessChannelMapper.xml
  8. 0
    24
      cmc-temperature-back/cmc-monitoring/src/main/resources/mapper/access/AccessDataMapper.xml
  9. 1
    1
      cmc-temperature-back/cmc-monitoring/src/main/resources/mapper/temperature/CmcChannelMapper.xml
  10. 1
    1
      cmc-temperature-back/cmc-monitoring/src/main/resources/mapper/temperature/CmcTemperatureMapper.xml
  11. 11
    11
      cmc-temperature-back/ruoyi-admin/src/main/resources/app-dev.yml
  12. 1
    1
      cmc-temperature-back/ruoyi-framework/src/main/java/com/ruoyi/framework/annotation/RyLog.java
  13. 30
    0
      cmc-temperature-back/ruoyi-schedule/src/main/java/com/ruoyi/schedule/task/AccessSyncTask.java

+ 1
- 1
cmc-temperature-back/cmc-monitoring/src/main/java/com/ruoyi/monitoring/mapper/CmcChannelMapper.java Целия файл

@@ -20,7 +20,7 @@ public interface CmcChannelMapper extends BaseMapper<CmcChannel> {
20 20
      */
21 21
     List<CmcChannel> listChannel(CmcChannel cmcChannel);
22 22
 
23
-    Long selectMaxId();
23
+    Integer selectMaxId();
24 24
 
25 25
     int batchInsert(@Param("list") List<CmcChannel> list);
26 26
 

+ 1
- 1
cmc-temperature-back/cmc-monitoring/src/main/java/com/ruoyi/monitoring/mapper/CmcTemperatureMapper.java Целия файл

@@ -25,7 +25,7 @@ public interface CmcTemperatureMapper extends BaseMapper<CmcTemperature> {
25 25
                                          @Param("startTime") String startTime,
26 26
                                          @Param("endTime") String endTime);
27 27
 
28
-    Long selectMaxId();
28
+    Integer selectMaxId();
29 29
 
30 30
     int batchInsert(@Param("list") List<CmcTemperature> list);
31 31
 

+ 0
- 18
cmc-temperature-back/cmc-monitoring/src/main/java/com/ruoyi/monitoring/mapper/access/AccessChannelMapper.java Целия файл

@@ -1,18 +0,0 @@
1
-package com.ruoyi.monitoring.mapper.access;
2
-
3
-import com.mybatisflex.annotation.UseDataSource;
4
-import com.mybatisflex.core.BaseMapper;
5
-import com.ruoyi.monitoring.domain.CmcChannel;
6
-import org.apache.ibatis.annotations.Param;
7
-
8
-import java.util.List;
9
-
10
-@UseDataSource("access")
11
-public interface AccessChannelMapper extends BaseMapper<CmcChannel> {
12
-
13
-    List<CmcChannel> listAll();
14
-
15
-    List<CmcChannel> listByIdRange(@Param("minIdExclusive") Long minIdExclusive);
16
-}
17
-
18
-

+ 0
- 16
cmc-temperature-back/cmc-monitoring/src/main/java/com/ruoyi/monitoring/mapper/access/AccessDataMapper.java Целия файл

@@ -1,16 +0,0 @@
1
-package com.ruoyi.monitoring.mapper.access;
2
-
3
-import com.mybatisflex.annotation.UseDataSource;
4
-import com.mybatisflex.core.BaseMapper;
5
-import com.ruoyi.monitoring.domain.CmcTemperature;
6
-import org.apache.ibatis.annotations.Param;
7
-
8
-import java.util.List;
9
-
10
-@UseDataSource("access")
11
-public interface AccessDataMapper extends BaseMapper<CmcTemperature> {
12
-
13
-    List<CmcTemperature> listByIdRange(@Param("minIdExclusive") Long minIdExclusive);
14
-}
15
-
16
-

+ 1
- 1
cmc-temperature-back/cmc-monitoring/src/main/java/com/ruoyi/monitoring/service/IAccessSyncService.java Целия файл

@@ -2,7 +2,7 @@ package com.ruoyi.monitoring.service;
2 2
 
3 3
 public interface IAccessSyncService {
4 4
 
5
-    void syncAccessToSqlite();
5
+    void syncAccessToSqlite() throws  Exception;
6 6
 }
7 7
 
8 8
 

+ 88
- 42
cmc-temperature-back/cmc-monitoring/src/main/java/com/ruoyi/monitoring/service/impl/AccessSyncServiceImpl.java Целия файл

@@ -4,12 +4,13 @@ import com.ruoyi.monitoring.domain.CmcChannel;
4 4
 import com.ruoyi.monitoring.domain.CmcTemperature;
5 5
 import com.ruoyi.monitoring.mapper.CmcChannelMapper;
6 6
 import com.ruoyi.monitoring.mapper.CmcTemperatureMapper;
7
-import com.ruoyi.monitoring.mapper.access.AccessChannelMapper;
8
-import com.ruoyi.monitoring.mapper.access.AccessDataMapper;
9 7
 import com.ruoyi.monitoring.service.IAccessSyncService;
8
+import org.noear.solon.Solon;
10 9
 import org.noear.solon.annotation.Component;
11 10
 import org.noear.solon.annotation.Inject;
12 11
 
12
+import java.sql.*;
13
+import java.util.ArrayList;
13 14
 import java.util.List;
14 15
 
15 16
 @Component
@@ -18,12 +19,6 @@ public class AccessSyncServiceImpl implements IAccessSyncService {
18 19
     // 每批插入的记录数
19 20
     private static final int BATCH_SIZE = 5000;
20 21
 
21
-    @Inject
22
-    AccessChannelMapper accessChannelMapper;
23
-
24
-    @Inject
25
-    AccessDataMapper accessDataMapper;
26
-
27 22
     @Inject
28 23
     CmcChannelMapper sqliteChannelMapper;
29 24
 
@@ -31,53 +26,106 @@ public class AccessSyncServiceImpl implements IAccessSyncService {
31 26
     CmcTemperatureMapper sqliteDataMapper;
32 27
 
33 28
     @Override
34
-    public void syncAccessToSqlite() {
29
+    public void syncAccessToSqlite() throws Exception {
35 30
         System.out.println("开始同步Access数据到SQLite...");
36
-        
37
-        try {
38
-            // 同步 Channel:增量,按ID递增同步
31
+        Class.forName(Solon.cfg().getProperty("mybatis-flex.datasource.access.driverClassName"));
32
+
33
+        try (Connection conn = DriverManager.getConnection(
34
+                Solon.cfg().getProperty("mybatis-flex.datasource.access.jdbcUrl"), "", "")) {
35
+
36
+            // 直接同步 Channel 表
39 37
             System.out.println("开始同步Channel表...");
40
-            Long channelMaxId = sqliteChannelMapper.selectMaxId();
41
-            if (channelMaxId == null) {
42
-                channelMaxId = 0L;
43
-            }
38
+            Integer channelMaxId = sqliteChannelMapper.selectMaxId();
44 39
             System.out.println("SQLite Channel表当前最大ID: " + channelMaxId);
45
-            List<CmcChannel> newChannels = accessChannelMapper.listByIdRange(channelMaxId);
46
-            if (newChannels != null && !newChannels.isEmpty()) {
40
+
41
+            List<CmcChannel> newChannels = new ArrayList<>();
42
+
43
+            String channelQuery = "SELECT ID, Sensor_No, Info, Ver, Sn, Ca, Cb, Units, LastDT " +
44
+                    "FROM Channel " +
45
+                    "WHERE ID > ? " +
46
+                    "ORDER BY ID ASC";
47
+
48
+            try (PreparedStatement pstmt = conn.prepareStatement(channelQuery)) {
49
+                pstmt.setInt(1, channelMaxId);
50
+                try (ResultSet rs = pstmt.executeQuery()) {
51
+                    while (rs.next()) {
52
+                        CmcChannel channel = new CmcChannel();
53
+                        channel.setId(rs.getInt("ID"));
54
+                        channel.setSensorNo(rs.getInt("Sensor_No"));
55
+                        channel.setInfo(rs.getString("Info"));
56
+                        channel.setVer(rs.getInt("Ver"));
57
+                        channel.setSn(rs.getString("Sn"));
58
+                        channel.setCa(rs.getInt("Ca"));
59
+                        channel.setCb(rs.getInt("Cb"));
60
+                        channel.setUnits(rs.getString("Units"));
61
+                        channel.setLastDT(rs.getString("LastDT"));
62
+                        newChannels.add(channel);
63
+                    }
64
+                }
65
+            }
66
+
67
+            if (!newChannels.isEmpty()) {
47 68
                 System.out.println("从Access读取到" + newChannels.size() + "条新Channel记录(ID > " + channelMaxId + ")");
48
-                // 分批插入
49 69
                 batchInsertChannels(newChannels);
50 70
                 System.out.println("Channel表同步完成,共同步" + newChannels.size() + "条记录");
51 71
             } else {
52 72
                 System.out.println("没有新的Channel记录需要同步(ID > " + channelMaxId + ")");
53 73
             }
54 74
 
55
-            // 同步 Data:增量,按ID递增同步
75
+            // 同步 Data
56 76
             System.out.println("开始同步Data表...");
57
-            Long dataMaxId = sqliteDataMapper.selectMaxId();
58
-            if (dataMaxId == null) {
59
-                dataMaxId = 0L;
60
-            }
77
+            Integer dataMaxId = sqliteDataMapper.selectMaxId();
61 78
             System.out.println("SQLite Data表当前最大ID: " + dataMaxId);
62
-            List<CmcTemperature> newData = accessDataMapper.listByIdRange(dataMaxId);
63
-            for (CmcTemperature cmcTemperature : newData) {
64
-                cmcTemperature.setDatetime(cmcTemperature.getDatetime().replace(".000000", ""));
65
-                cmcTemperature.setData(cmcTemperature.getData().replace("00000", ""));
79
+
80
+            List<CmcTemperature> newData = new ArrayList<>();
81
+            String dataQuery = "SELECT ID, Group_No, Sensor_No, DateTime, Data, Volt, CSQ " +
82
+                    "FROM Data " +
83
+                    "WHERE ID > ? " +
84
+                    "ORDER BY ID ASC";
85
+
86
+            try (PreparedStatement pstmt = conn.prepareStatement(dataQuery)) {
87
+                pstmt.setInt(1, dataMaxId);
88
+                try (ResultSet rs = pstmt.executeQuery()) {
89
+                    while (rs.next()) {
90
+                        CmcTemperature data = new CmcTemperature();
91
+                        data.setId(rs.getInt("ID"));
92
+                        data.setGroupNo(rs.getInt("Group_No"));
93
+                        data.setSensorNo(rs.getInt("Sensor_No"));
94
+
95
+                        // 处理日期时间字段
96
+                        String datetime = rs.getString("DateTime");
97
+                        if (datetime != null) {
98
+                            data.setDatetime(datetime.replace(".000000", ""));
99
+                        } else {
100
+                            data.setDatetime("");
101
+                        }
102
+
103
+                        // 处理数据字段
104
+                        String dataValue = rs.getString("Data");
105
+                        if (dataValue != null) {
106
+                            data.setData(dataValue.replace("00000", ""));
107
+                        } else {
108
+                            data.setData("");
109
+                        }
110
+
111
+                        data.setVolt(rs.getString("Volt"));
112
+                        data.setCSQ(rs.getInt("CSQ"));
113
+                        newData.add(data);
114
+                    }
115
+                }
66 116
             }
67
-            if (newData != null && !newData.isEmpty()) {
117
+
118
+            if (!newData.isEmpty()) {
68 119
                 System.out.println("从Access读取到" + newData.size() + "条新Data记录(ID > " + dataMaxId + ")");
69
-                // 分批插入
70 120
                 batchInsertData(newData);
71 121
                 System.out.println("Data表同步完成,共同步" + newData.size() + "条新记录");
72 122
             } else {
73 123
                 System.out.println("没有新的Data记录需要同步(ID > " + dataMaxId + ")");
74 124
             }
75
-            
125
+
76 126
             System.out.println("Access数据同步到SQLite完成");
77
-        } catch (Exception e) {
78
-            System.out.println("同步Access数据到SQLite失败: " + e.getMessage());
79
-            e.printStackTrace();
80
-            throw e;
127
+        } catch (SQLException e) {
128
+            throw new RuntimeException("Access数据库查询失败", e);
81 129
         }
82 130
     }
83 131
 
@@ -87,12 +135,12 @@ public class AccessSyncServiceImpl implements IAccessSyncService {
87 135
     private void batchInsertChannels(List<CmcChannel> channels) {
88 136
         int total = channels.size();
89 137
         int batchCount = (total + BATCH_SIZE - 1) / BATCH_SIZE;
90
-        
138
+
91 139
         for (int i = 0; i < batchCount; i++) {
92 140
             int fromIndex = i * BATCH_SIZE;
93 141
             int toIndex = Math.min((i + 1) * BATCH_SIZE, total);
94 142
             List<CmcChannel> batch = channels.subList(fromIndex, toIndex);
95
-            
143
+
96 144
             sqliteChannelMapper.batchInsert(batch);
97 145
             System.out.println("Channel表已插入第 " + (i + 1) + "/" + batchCount + " 批,共 " + batch.size() + " 条记录");
98 146
         }
@@ -104,16 +152,14 @@ public class AccessSyncServiceImpl implements IAccessSyncService {
104 152
     private void batchInsertData(List<CmcTemperature> dataList) {
105 153
         int total = dataList.size();
106 154
         int batchCount = (total + BATCH_SIZE - 1) / BATCH_SIZE;
107
-        
155
+
108 156
         for (int i = 0; i < batchCount; i++) {
109 157
             int fromIndex = i * BATCH_SIZE;
110 158
             int toIndex = Math.min((i + 1) * BATCH_SIZE, total);
111 159
             List<CmcTemperature> batch = dataList.subList(fromIndex, toIndex);
112
-            
160
+
113 161
             sqliteDataMapper.batchInsert(batch);
114 162
             System.out.println("Data表已插入第 " + (i + 1) + "/" + batchCount + " 批,共 " + batch.size() + " 条记录");
115 163
         }
116 164
     }
117
-}
118
-
119
-
165
+}

+ 0
- 31
cmc-temperature-back/cmc-monitoring/src/main/resources/mapper/access/AccessChannelMapper.xml Целия файл

@@ -1,31 +0,0 @@
1
-<?xml version="1.0" encoding="UTF-8" ?>
2
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
3
-        "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
4
-<mapper namespace="com.ruoyi.monitoring.mapper.access.AccessChannelMapper">
5
-
6
-    <resultMap type="com.ruoyi.monitoring.domain.CmcChannel" id="CmcChannelResult">
7
-        <id     property="Id"      column="ID"      />
8
-        <result property="SensorNo"     column="Sensor_No"     />
9
-        <result property="Info"   column="Info"   />
10
-        <result property="Ver"    column="Ver"    />
11
-        <result property="Sn"      column="Sn"      />
12
-        <result property="Ca"    column="Ca"    />
13
-        <result property="Cb"    column="Cb"    />
14
-        <result property="Units"    column="Units"    />
15
-        <result property="LastDT"    column="LastDT"    />
16
-    </resultMap>
17
-
18
-    <select id="listAll" resultMap="CmcChannelResult">
19
-        SELECT c.ID, c.Sensor_No, c.Info, c.Ver, c.Sn, c.Ca, c.Cb, c.Units, c.LastDT
20
-        FROM Channel c
21
-    </select>
22
-
23
-    <select id="listByIdRange" resultMap="CmcChannelResult">
24
-        SELECT c.ID, c.Sensor_No, c.Info, c.Ver, c.Sn, c.Ca, c.Cb, c.Units, c.LastDT
25
-        FROM Channel c
26
-        WHERE c.ID > #{minIdExclusive}
27
-        ORDER BY c.ID ASC
28
-    </select>
29
-
30
-</mapper>
31
-

+ 0
- 24
cmc-temperature-back/cmc-monitoring/src/main/resources/mapper/access/AccessDataMapper.xml Целия файл

@@ -1,24 +0,0 @@
1
-<?xml version="1.0" encoding="UTF-8" ?>
2
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
3
-        "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
4
-<mapper namespace="com.ruoyi.monitoring.mapper.access.AccessDataMapper">
5
-
6
-    <resultMap type="com.ruoyi.monitoring.domain.CmcTemperature" id="CmcTemperatureResult">
7
-        <id     property="Id"      column="ID"      />
8
-        <result property="GroupNo"    column="Group_No"    />
9
-        <result property="SensorNo"     column="Sensor_No"     />
10
-        <result property="Datetime"   column="DateTime"   />
11
-        <result property="Data"    column="Data"    />
12
-        <result property="Volt"      column="Volt"      />
13
-        <result property="CSQ"    column="CSQ"    />
14
-    </resultMap>
15
-
16
-    <select id="listByIdRange" resultMap="CmcTemperatureResult">
17
-        SELECT d.ID, d.Group_No, d.Sensor_No, d.DateTime, d.Data, d.Volt, d.CSQ
18
-        FROM Data d
19
-        WHERE d.ID &gt; #{minIdExclusive}
20
-        ORDER BY d.ID ASC
21
-    </select>
22
-
23
-</mapper>
24
-

+ 1
- 1
cmc-temperature-back/cmc-monitoring/src/main/resources/mapper/temperature/CmcChannelMapper.xml Целия файл

@@ -35,7 +35,7 @@
35 35
         </where>
36 36
     </select>
37 37
 
38
-    <select id="selectMaxId" resultType="long">
38
+    <select id="selectMaxId" resultType="int">
39 39
         SELECT IFNULL(MAX(ID), 0) FROM Channel
40 40
     </select>
41 41
 

+ 1
- 1
cmc-temperature-back/cmc-monitoring/src/main/resources/mapper/temperature/CmcTemperatureMapper.xml Целия файл

@@ -38,7 +38,7 @@
38 38
         ORDER BY d.DateTime ASC, d.Sensor_No ASC
39 39
     </select>
40 40
 
41
-    <select id="selectMaxId" resultType="long">
41
+    <select id="selectMaxId" resultType="int">
42 42
         SELECT IFNULL(MAX(ID), 0) FROM Data
43 43
     </select>
44 44
 

+ 11
- 11
cmc-temperature-back/ruoyi-admin/src/main/resources/app-dev.yml Целия файл

@@ -165,14 +165,14 @@ mybatis-flex:
165 165
     sqlite:
166 166
       type: com.zaxxer.hikari.HikariDataSource
167 167
       driverClassName: org.sqlite.JDBC
168
-      jdbcUrl: jdbc:sqlite::resource:static/cmc-temperature.db?date_string_format=yyyy-MM-dd HH:mm:ss
168
+      jdbcUrl: jdbc:sqlite:///home/cmcgis/projects/cmc-temperature/Data/cmc-temperature.db?date_string_format=yyyy-MM-dd HH:mm:ss
169
+#      jdbcUrl: jdbc:sqlite://E:/Java/cmc-temperature/cmc-temperature-back/sql/Data/cmc-temperature.db?date_string_format=yyyy-MM-dd HH:mm:ss
169 170
       username:
170 171
       password:
171 172
     access:
172
-      type: com.zaxxer.hikari.HikariDataSource
173 173
       driverClassName: net.ucanaccess.jdbc.UcanaccessDriver
174
-#      jdbcUrl: jdbc:ucanaccess:///home/cmcgis/projects/cmc-temperature/Data/SKREC_ID1.accdb;showSchema=false;sysSchema=false;memory=false;keepMirror=true;immediatelyReleaseResources=true;openExclusive=false;net.ucanaccess.metadata=ignore;ignoreCase=true;logLevel=WARNING;newDatabaseVersion=V2007
175
-      jdbcUrl: jdbc:ucanaccess://E:/Java/cmc-temperature/cmc-temperature-back/sql/Data/SKREC_ID1.accdb;memory=false;keepMirror=true;immediatelyReleaseResources=true;ignorecase=true;showschema=false;sysschema=false;openExclusive=false
174
+      jdbcUrl: jdbc:ucanaccess:///home/cmcgis/projects/cmc-temperature/Data/SKREC_ID1.accdb;ignorecase=true
175
+#      jdbcUrl: jdbc:ucanaccess://E:/Java/cmc-temperature/cmc-temperature-back/sql/Data/SKREC_ID1.accdb;ignorecase=true
176 176
       username:
177 177
       password:
178 178
 #      type: com.zaxxer.hikari.HikariDataSource
@@ -214,18 +214,18 @@ mybatis-flex:
214 214
 # Redis配置
215 215
 redis:
216 216
   cache_source:
217
-#    config: |
218
-#      singleServerConfig:
219
-#        address: redis://cmc-redis:6379
220
-#        password:
221
-#        database: 7
222
-#      codec: !<org.redisson.codec.JsonJacksonCodec> {}
223 217
     config: |
224 218
       singleServerConfig:
225
-        address: redis://localhost:6379
219
+        address: redis://cmc-redis:6379
226 220
         password:
227 221
         database: 7
228 222
       codec: !<org.redisson.codec.JsonJacksonCodec> {}
223
+#    config: |
224
+#      singleServerConfig:
225
+#        address: redis://localhost:6379
226
+#        password:
227
+#        database: 7
228
+#      codec: !<org.redisson.codec.JsonJacksonCodec> {}
229 229
 
230 230
 # 分页插件配置
231 231
 pagehelper:

+ 1
- 1
cmc-temperature-back/ruoyi-framework/src/main/java/com/ruoyi/framework/annotation/RyLog.java Целия файл

@@ -34,6 +34,6 @@ public @interface RyLog {
34 34
     /**
35 35
      * 是否保存响应数据
36 36
      */
37
-    boolean isSaveResponseData() default true;
37
+    boolean isSaveResponseData() default false;
38 38
 
39 39
 }

+ 30
- 0
cmc-temperature-back/ruoyi-schedule/src/main/java/com/ruoyi/schedule/task/AccessSyncTask.java Целия файл

@@ -0,0 +1,30 @@
1
+package com.ruoyi.schedule.task;
2
+
3
+import com.ruoyi.monitoring.service.IAccessSyncService;
4
+import org.noear.solon.annotation.Component;
5
+import org.noear.solon.annotation.Inject;
6
+import org.noear.solon.scheduling.annotation.Scheduled;
7
+
8
+import java.util.Date;
9
+
10
+@Component
11
+public class AccessSyncTask {
12
+
13
+    @Inject
14
+    IAccessSyncService accessSyncService;
15
+
16
+    // 每小时执行一次(cron格式:秒 分 时 日 月 周 年)
17
+    @Scheduled(cron = "0 20 0/1 * * ? *", zone = "Asia/Shanghai")
18
+    public void sync() throws Exception {
19
+        System.out.println("========== Access数据同步任务开始执行,当前时间: " + new Date() + "==========");
20
+        try {
21
+            accessSyncService.syncAccessToSqlite();
22
+            System.out.println("========== Access数据同步任务执行成功,当前时间: " + new Date() + "==========");
23
+        } catch (Exception e) {
24
+            System.out.println("========== Access数据同步任务执行失败 ==========");
25
+            throw e;
26
+        }
27
+    }
28
+}
29
+
30
+

Loading…
Отказ
Запис