Просмотр исходного кода

优化本地数据库保存功能

jingbo 1 неделя назад
Родитель
Сommit
06561ada0f

+ 88 - 8
src/com/mes/ui/DeviceManagePanel.java

@@ -8,6 +8,7 @@ import javax.swing.table.DefaultTableModel;
 import java.awt.*;
 import java.awt.*;
 import java.util.ArrayList;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.List;
+import java.util.Map;
 
 
 /**
 /**
  * 设备管理:IP、预设数量、按颗数区间的铆接参数配置
  * 设备管理:IP、预设数量、按颗数区间的铆接参数配置
@@ -145,6 +146,19 @@ public class DeviceManagePanel extends JPanel {
         fillTableModel(tableModelB, JdbcUtils.getRivetParams("B"));
         fillTableModel(tableModelB, JdbcUtils.getRivetParams("B"));
     }
     }
 
 
+    // 重新从数据库加载到界面(进入设备管理页时调用)
+    public void reloadFromDb() {
+        Map<String, Object> config = JdbcUtils.getConfig();
+        if (config.size() > 0) {
+            MesClient.aSetNum = (Short) config.get("a_set_num");
+            MesClient.bSetNum = (Short) config.get("b_set_num");
+            MesClient.curIpA = (String) config.get("plc_ip_a");
+            MesClient.curIpB = (String) config.get("plc_ip_b");
+        }
+        MesClient.loadRivetParamConfig();
+        loadConfigToUi();
+    }
+
     private void fillTableModel(DefaultTableModel model, List<RivetParamRange> ranges) {
     private void fillTableModel(DefaultTableModel model, List<RivetParamRange> ranges) {
         model.setRowCount(0);
         model.setRowCount(0);
         for (RivetParamRange range : ranges) {
         for (RivetParamRange range : ranges) {
@@ -175,19 +189,46 @@ public class DeviceManagePanel extends JPanel {
             if (start < 1 || end < start) {
             if (start < 1 || end < start) {
                 throw new IllegalArgumentException(gunType + "枪第" + (i + 1) + "行颗数范围无效");
                 throw new IllegalArgumentException(gunType + "枪第" + (i + 1) + "行颗数范围无效");
             }
             }
+            int fMin = parseIntCell(model, i, 2);
+            int fMax = parseIntCell(model, i, 3);
+            int sMin = parseIntCell(model, i, 4);
+            int sMax = parseIntCell(model, i, 5);
+            if (fMin > fMax) {
+                throw new IllegalArgumentException(gunType + "枪第" + (i + 1) + "行 F-min 不能大于 F-max");
+            }
+            if (sMin > sMax) {
+                throw new IllegalArgumentException(gunType + "枪第" + (i + 1) + "行 S-min 不能大于 S-max");
+            }
+            // PLC Int16 写入上限,避免溢出后下发错误值
+            if (fMin < Short.MIN_VALUE || fMax > Short.MAX_VALUE
+                    || sMin < Short.MIN_VALUE || sMax > Short.MAX_VALUE) {
+                throw new IllegalArgumentException(gunType + "枪第" + (i + 1) + "行参数超出范围(-32768~32767)");
+            }
             RivetParamRange range = new RivetParamRange();
             RivetParamRange range = new RivetParamRange();
             range.setGunType(gunType);
             range.setGunType(gunType);
             range.setStartRivet(start);
             range.setStartRivet(start);
             range.setEndRivet(end);
             range.setEndRivet(end);
-            range.setFMin(parseIntCell(model, i, 2));
-            range.setFMax(parseIntCell(model, i, 3));
-            range.setSMin(parseIntCell(model, i, 4));
-            range.setSMax(parseIntCell(model, i, 5));
+            range.setFMin(fMin);
+            range.setFMax(fMax);
+            range.setSMin(sMin);
+            range.setSMax(sMax);
             ranges.add(range);
             ranges.add(range);
         }
         }
         if (ranges.isEmpty()) {
         if (ranges.isEmpty()) {
             throw new IllegalArgumentException(gunType + "枪至少配置一行参数区间");
             throw new IllegalArgumentException(gunType + "枪至少配置一行参数区间");
         }
         }
+        // 检查区间是否重叠,重叠会导致下发时命中错误行
+        for (int i = 0; i < ranges.size(); i++) {
+            RivetParamRange a = ranges.get(i);
+            for (int j = i + 1; j < ranges.size(); j++) {
+                RivetParamRange b = ranges.get(j);
+                if (a.getStartRivet() <= b.getEndRivet() && b.getStartRivet() <= a.getEndRivet()) {
+                    throw new IllegalArgumentException(gunType + "枪参数区间存在重叠:"
+                            + a.getStartRivet() + "-" + a.getEndRivet()
+                            + " 与 " + b.getStartRivet() + "-" + b.getEndRivet());
+                }
+            }
+        }
         return ranges;
         return ranges;
     }
     }
 
 
@@ -199,7 +240,29 @@ public class DeviceManagePanel extends JPanel {
         return Integer.parseInt(text);
         return Integer.parseInt(text);
     }
     }
 
 
+    // 提交表格编辑并将参数下发到PLC
+    private boolean pushRivetParamsToDevice(ModbusTcp plc, List<RivetParamRange> ranges, String gunType) {
+        if (plc == null) {
+            System.out.println(gunType + "枪PLC未连接,跳过参数下发");
+            return false;
+        }
+        try {
+            ModbusUtil.syncRivetParamsToPlc(plc, ranges);
+            return true;
+        } catch (Exception ex) {
+            ex.printStackTrace();
+            return false;
+        }
+    }
+
     private void saveAllConfig() {
     private void saveAllConfig() {
+        // 保存前先结束表格编辑,确保最新输入写入模型
+        if (tableA != null && tableA.isEditing()) {
+            tableA.getCellEditor().stopCellEditing();
+        }
+        if (tableB != null && tableB.isEditing()) {
+            tableB.getCellEditor().stopCellEditing();
+        }
         try {
         try {
             short newASet = Short.parseShort(txtASet.getText().trim());
             short newASet = Short.parseShort(txtASet.getText().trim());
             short newBSet = Short.parseShort(txtBSet.getText().trim());
             short newBSet = Short.parseShort(txtBSet.getText().trim());
@@ -213,9 +276,17 @@ public class DeviceManagePanel extends JPanel {
             List<RivetParamRange> rangesA = parseTableModel(tableModelA, "A");
             List<RivetParamRange> rangesA = parseTableModel(tableModelA, "A");
             List<RivetParamRange> rangesB = parseTableModel(tableModelB, "B");
             List<RivetParamRange> rangesB = parseTableModel(tableModelB, "B");
 
 
-            JdbcUtils.updateConfig(newASet, newBSet, newIpA, newIpB);
-            JdbcUtils.saveRivetParams("A", rangesA);
-            JdbcUtils.saveRivetParams("B", rangesB);
+            boolean configOk = JdbcUtils.updateConfig(newASet, newBSet, newIpA, newIpB);
+            boolean saveAOk = JdbcUtils.saveRivetParams("A", rangesA);
+            boolean saveBOk = JdbcUtils.saveRivetParams("B", rangesB);
+            if (!configOk || !saveAOk || !saveBOk) {
+                JOptionPane.showMessageDialog(MesClient.mesClientFrame,
+                        "配置保存失败,请查看控制台日志后重试(常见原因:数据库被占用)",
+                        "错误", JOptionPane.ERROR_MESSAGE);
+                // 回读数据库,避免界面显示未真正落库的值
+                reloadFromDb();
+                return;
+            }
 
 
             MesClient.aSetNum = newASet;
             MesClient.aSetNum = newASet;
             MesClient.bSetNum = newBSet;
             MesClient.bSetNum = newBSet;
@@ -246,7 +317,16 @@ public class DeviceManagePanel extends JPanel {
                 MesClient.plcB = new ModbusTcp(1, MesClient.curIpB);
                 MesClient.plcB = new ModbusTcp(1, MesClient.curIpB);
             }
             }
 
 
-            JOptionPane.showMessageDialog(MesClient.mesClientFrame, "配置已保存", "提示", JOptionPane.INFORMATION_MESSAGE);
+            // 保存后立即将拉力/行程参数下发到设备
+            boolean syncA = pushRivetParamsToDevice(MesClient.plcA, rangesA, "A");
+            boolean syncB = pushRivetParamsToDevice(MesClient.plcB, rangesB, "B");
+            if (syncA && syncB) {
+                JOptionPane.showMessageDialog(MesClient.mesClientFrame, "配置已保存,并已下发到设备", "提示", JOptionPane.INFORMATION_MESSAGE);
+            } else {
+                JOptionPane.showMessageDialog(MesClient.mesClientFrame,
+                        "配置已保存到本地,但部分设备参数下发失败,请检查设备连接;下次开工时会按新配置重新下发",
+                        "提示", JOptionPane.WARNING_MESSAGE);
+            }
         } catch (NumberFormatException ex) {
         } catch (NumberFormatException ex) {
             JOptionPane.showMessageDialog(MesClient.mesClientFrame, "请输入有效的数字", "错误", JOptionPane.ERROR_MESSAGE);
             JOptionPane.showMessageDialog(MesClient.mesClientFrame, "请输入有效的数字", "错误", JOptionPane.ERROR_MESSAGE);
         } catch (IllegalArgumentException ex) {
         } catch (IllegalArgumentException ex) {

+ 6 - 5
src/com/mes/ui/MesClient.java

@@ -577,10 +577,7 @@ public class MesClient extends JFrame {
                 setMenuStatus(msg != null && !msg.isEmpty() ? msg : "该工件可以加工", 0);
                 setMenuStatus(msg != null && !msg.isEmpty() ? msg : "该工件可以加工", 0);
             }
             }
 
 
-            ModbusUtil.setPowerOn(plcA);
-            ModbusUtil.setPowerOn(plcB);
-            ModbusUtil.setTask(plcA, aSetNum, "A");
-            ModbusUtil.setTask(plcB, bSetNum, "B");
+            ModbusUtil.prepareAndStartWork();
             return true;
             return true;
         }
         }
 
 
@@ -747,7 +744,7 @@ public class MesClient extends JFrame {
     public static int lastSelectedIndex = 0;
     public static int lastSelectedIndex = 0;
     public MesClient() {
     public MesClient() {
         setIconImage(Toolkit.getDefaultToolkit().getImage(MesClient.class.getResource("/bg/logo.png")));
         setIconImage(Toolkit.getDefaultToolkit().getImage(MesClient.class.getResource("/bg/logo.png")));
-        setTitle("MES系统客户端:"+mes_gw + "- " + mes_gw_des);
+        setTitle("MES系统客户端:HEV-"+mes_gw + "- " + mes_gw_des);
         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         setBounds(0, 0, 1024, 768);
         setBounds(0, 0, 1024, 768);
 
 
@@ -1108,6 +1105,10 @@ public class MesClient extends JFrame {
                     String input = JOptionPane.showInputDialog(mesClientFrame, "请输入管理员密码以进入设备管理:", "权限验证", JOptionPane.QUESTION_MESSAGE);
                     String input = JOptionPane.showInputDialog(mesClientFrame, "请输入管理员密码以进入设备管理:", "权限验证", JOptionPane.QUESTION_MESSAGE);
                     if (input != null && input.equals("503833")) {
                     if (input != null && input.equals("503833")) {
                         lastSelectedIndex = selectedIndex;
                         lastSelectedIndex = selectedIndex;
+                        // 每次进入都从数据库重载,确保看到的是已落库的最新配置
+                        if (indexPanelD instanceof DeviceManagePanel) {
+                            ((DeviceManagePanel) indexPanelD).reloadFromDb();
+                        }
                     } else {
                     } else {
                         if (input != null) {
                         if (input != null) {
                             JOptionPane.showMessageDialog(mesClientFrame, "密码错误,请重试", "错误", JOptionPane.ERROR_MESSAGE);
                             JOptionPane.showMessageDialog(mesClientFrame, "密码错误,请重试", "错误", JOptionPane.ERROR_MESSAGE);

+ 2 - 9
src/com/mes/ui/MesRevice.java

@@ -19,10 +19,7 @@ public class MesRevice {
                 if(MesClient.work_status == 0 ){
                 if(MesClient.work_status == 0 ){
                     MesClient.work_status = 1;
                     MesClient.work_status = 1;
                     MesClient.tjStatus = 0;
                     MesClient.tjStatus = 0;
-                    ModbusUtil.setPowerOn(MesClient.plcA);
-                    ModbusUtil.setPowerOn(MesClient.plcB);
-                    ModbusUtil.setTask(MesClient.plcA, MesClient.aSetNum, "A");
-                    ModbusUtil.setTask(MesClient.plcB, MesClient.bSetNum, "B");
+                    ModbusUtil.prepareAndStartWork();
                 }
                 }
             }else {
             }else {
                 MesClient.check_quality_result = false;
                 MesClient.check_quality_result = false;
@@ -64,11 +61,7 @@ public class MesRevice {
 //                MesClient.plcA.writeCoil(3128,false);
 //                MesClient.plcA.writeCoil(3128,false);
 //                MesClient.plcB.writeCoil(3128,false);
 //                MesClient.plcB.writeCoil(3128,false);
 
 
-                ModbusUtil.setPowerOn(MesClient.plcA); // 远程开机
-                ModbusUtil.setPowerOn(MesClient.plcB); // 远程开机
-
-                ModbusUtil.setTask(MesClient.plcA, MesClient.aSetNum, "A");
-                ModbusUtil.setTask(MesClient.plcB, MesClient.bSetNum, "B");
+                ModbusUtil.prepareAndStartWork();
             }
             }
         }catch (Exception e){
         }catch (Exception e){
             e.printStackTrace();
             e.printStackTrace();

+ 44 - 2
src/com/mes/ui/ModbusUtil.java

@@ -237,6 +237,49 @@ public class ModbusUtil {
         return null;
         return null;
     }
     }
 
 
+    // 获取指定枪的参数区间,必要时从数据库重新加载
+    private static List<RivetParamRange> getRivetParamRanges(String gunType) {
+        List<RivetParamRange> ranges = "A".equalsIgnoreCase(gunType)
+                ? MesClient.rivetParamRangesA : MesClient.rivetParamRangesB;
+        if (ranges == null || ranges.isEmpty()) {
+            MesClient.loadRivetParamConfig();
+            ranges = "A".equalsIgnoreCase(gunType)
+                    ? MesClient.rivetParamRangesA : MesClient.rivetParamRangesB;
+        }
+        return ranges;
+    }
+
+    // 扫码/开工:加载最新配置、远程开机并下发任务与第1颗拉力/行程参数
+    public static void prepareAndStartWork() {
+        MesClient.loadRivetParamConfig();
+        setPowerOn(MesClient.plcA);
+        setPowerOn(MesClient.plcB);
+        setTask(MesClient.plcA, MesClient.aSetNum, "A");
+        setTask(MesClient.plcB, MesClient.bSetNum, "B");
+        System.out.println("开工下发完成:A枪" + MesClient.aSetNum + "颗, B枪" + MesClient.bSetNum + "颗");
+    }
+
+    // 保存配置后,按PLC当前进度将对应颗数的拉力/行程参数立即下发
+    public static void syncRivetParamsToPlc(ModbusTcp plc, List<RivetParamRange> ranges) {
+        if (plc == null || ranges == null || ranges.isEmpty()) {
+            return;
+        }
+        try {
+            int rivetNo;
+            if (MesClient.work_status == 1) {
+                short cur = plc.readInt16(1136);
+                rivetNo = Math.max(cur + 1, 1);
+            } else {
+                // 非加工中按第1颗区间下发,避免沿用上次的完成颗数
+                rivetNo = 1;
+            }
+            applyParamsForRivet(plc, ranges, rivetNo);
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException(e);
+        }
+    }
+
     // 按颗数下发PLC拉力/行程参数
     // 按颗数下发PLC拉力/行程参数
     public static void applyParamsForRivet(ModbusTcp plc, List<RivetParamRange> ranges, int rivetNo) {
     public static void applyParamsForRivet(ModbusTcp plc, List<RivetParamRange> ranges, int rivetNo) {
         RivetParamRange range = findRivetParamRange(ranges, rivetNo);
         RivetParamRange range = findRivetParamRange(ranges, rivetNo);
@@ -266,8 +309,7 @@ public class ModbusUtil {
             plc.writeInt16(1136,(short) 0);
             plc.writeInt16(1136,(short) 0);
             plc.writeInt16(1138,(short) 0);
             plc.writeInt16(1138,(short) 0);
 
 
-            List<RivetParamRange> ranges = "A".equalsIgnoreCase(gunType)
-                    ? MesClient.rivetParamRangesA : MesClient.rivetParamRangesB;
+            List<RivetParamRange> ranges = getRivetParamRanges(gunType);
             applyParamsForRivet(plc, ranges, 1);
             applyParamsForRivet(plc, ranges, 1);
 
 
         }catch (Exception e){
         }catch (Exception e){

+ 68 - 24
src/com/mes/util/JdbcUtils.java

@@ -14,8 +14,16 @@ public class JdbcUtils {
     
     
     public static Connection getConn(){
     public static Connection getConn(){
         try {
         try {
+            // 复用已打开连接,避免每次新建导致多连接争用、保存失败却仍提示成功
+            if (conn != null && !conn.isClosed()) {
+                return conn;
+            }
             Class.forName(Drivde);// 加载驱动,连接sqlite的jdbc
             Class.forName(Drivde);// 加载驱动,连接sqlite的jdbc
             conn = DriverManager.getConnection("jdbc:sqlite:mes_db.db");//连接数据库zhou.db,不存在则创建
             conn = DriverManager.getConnection("jdbc:sqlite:mes_db.db");//连接数据库zhou.db,不存在则创建
+            // 忙碌时等待,降低与定时任务并发写库被锁失败的概率
+            try (Statement busyStmt = conn.createStatement()) {
+                busyStmt.execute("PRAGMA busy_timeout = 5000");
+            }
             System.out.println("连接到SQLite数据库成功!");
             System.out.println("连接到SQLite数据库成功!");
             create_bw_record();//初始化结构表
             create_bw_record();//初始化结构表
             create_bw_prod();
             create_bw_prod();
@@ -169,48 +177,80 @@ public class JdbcUtils {
 		return list;
 		return list;
 	}
 	}
 
 
-	public static void saveRivetParams(String gunType, java.util.List<RivetParamRange> ranges) {
+	public static synchronized boolean saveRivetParams(String gunType, java.util.List<RivetParamRange> ranges) {
 		Connection conn = JdbcUtils.getConn();
 		Connection conn = JdbcUtils.getConn();
+		if (conn == null) {
+			System.out.println("保存铆接参数失败:数据库未连接, gunType=" + gunType);
+			return false;
+		}
 		try {
 		try {
-			PreparedStatement deleteStmt = conn.prepareStatement("DELETE FROM bw_rivet_param WHERE gun_type = ?");
-			deleteStmt.setString(1, gunType);
-			deleteStmt.executeUpdate();
-			deleteStmt.close();
+			boolean oldAutoCommit = conn.getAutoCommit();
+			conn.setAutoCommit(false);
+			try {
+				PreparedStatement deleteStmt = conn.prepareStatement("DELETE FROM bw_rivet_param WHERE gun_type = ?");
+				deleteStmt.setString(1, gunType);
+				deleteStmt.executeUpdate();
+				deleteStmt.close();
 
 
-			String insertSql = "INSERT INTO bw_rivet_param (gun_type,start_rivet,end_rivet,f_min,f_max,s_min,s_max,sort_order) "
-					+ "VALUES (?,?,?,?,?,?,?,?)";
-			PreparedStatement insertStmt = conn.prepareStatement(insertSql);
-			for (int i = 0; i < ranges.size(); i++) {
-				RivetParamRange range = ranges.get(i);
-				insertStmt.setString(1, gunType);
-				insertStmt.setInt(2, range.getStartRivet());
-				insertStmt.setInt(3, range.getEndRivet());
-				insertStmt.setInt(4, range.getFMin());
-				insertStmt.setInt(5, range.getFMax());
-				insertStmt.setInt(6, range.getSMin());
-				insertStmt.setInt(7, range.getSMax());
-				insertStmt.setInt(8, i + 1);
-				insertStmt.executeUpdate();
+				String insertSql = "INSERT INTO bw_rivet_param (gun_type,start_rivet,end_rivet,f_min,f_max,s_min,s_max,sort_order) "
+						+ "VALUES (?,?,?,?,?,?,?,?)";
+				PreparedStatement insertStmt = conn.prepareStatement(insertSql);
+				for (int i = 0; i < ranges.size(); i++) {
+					RivetParamRange range = ranges.get(i);
+					insertStmt.setString(1, gunType);
+					insertStmt.setInt(2, range.getStartRivet());
+					insertStmt.setInt(3, range.getEndRivet());
+					insertStmt.setInt(4, range.getFMin());
+					insertStmt.setInt(5, range.getFMax());
+					insertStmt.setInt(6, range.getSMin());
+					insertStmt.setInt(7, range.getSMax());
+					insertStmt.setInt(8, i + 1);
+					insertStmt.executeUpdate();
+				}
+				insertStmt.close();
+				conn.commit();
+				System.out.println("保存铆接参数成功:gunType=" + gunType + ", rows=" + ranges.size());
+				return true;
+			} catch (SQLException e) {
+				try {
+					conn.rollback();
+				} catch (SQLException rollbackEx) {
+					rollbackEx.printStackTrace();
+				}
+				throw e;
+			} finally {
+				conn.setAutoCommit(oldAutoCommit);
 			}
 			}
-			insertStmt.close();
-			System.out.println("保存铆接参数成功:gunType=" + gunType + ", rows=" + ranges.size());
 		} catch (SQLException e) {
 		} catch (SQLException e) {
 			e.printStackTrace();
 			e.printStackTrace();
+			System.out.println("保存铆接参数失败:gunType=" + gunType + ", err=" + e.getMessage());
+			return false;
 		}
 		}
 	}
 	}
 
 
-	public static void updateConfig(short aSetNum, short bSetNum, String plcIpA, String plcIpB) {
+	public static synchronized boolean updateConfig(short aSetNum, short bSetNum, String plcIpA, String plcIpB) {
 		String sql = "UPDATE bw_config SET a_set_num = ?, b_set_num = ?, plc_ip_a = ?, plc_ip_b = ? WHERE id = 1";
 		String sql = "UPDATE bw_config SET a_set_num = ?, b_set_num = ?, plc_ip_a = ?, plc_ip_b = ? WHERE id = 1";
 		Connection conn = JdbcUtils.getConn();
 		Connection conn = JdbcUtils.getConn();
+		if (conn == null) {
+			System.out.println("更新本地配置失败:数据库未连接");
+			return false;
+		}
 		try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
 		try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
 			pstmt.setShort(1, aSetNum);
 			pstmt.setShort(1, aSetNum);
 			pstmt.setShort(2, bSetNum);
 			pstmt.setShort(2, bSetNum);
 			pstmt.setString(3, plcIpA);
 			pstmt.setString(3, plcIpA);
 			pstmt.setString(4, plcIpB);
 			pstmt.setString(4, plcIpB);
-			pstmt.executeUpdate();
+			int rows = pstmt.executeUpdate();
+			if (rows <= 0) {
+				System.out.println("更新本地配置失败:未更新到任何行");
+				return false;
+			}
 			System.out.println("更新本地配置成功:aSetNum=" + aSetNum + ", bSetNum=" + bSetNum + ", IP_A=" + plcIpA + ", IP_B=" + plcIpB);
 			System.out.println("更新本地配置成功:aSetNum=" + aSetNum + ", bSetNum=" + bSetNum + ", IP_A=" + plcIpA + ", IP_B=" + plcIpB);
+			return true;
 		} catch (SQLException e) {
 		} catch (SQLException e) {
 			e.printStackTrace();
 			e.printStackTrace();
+			System.out.println("更新本地配置失败:" + e.getMessage());
+			return false;
 		}
 		}
 	}
 	}
 
 
@@ -219,6 +259,7 @@ public class JdbcUtils {
         try {
         try {
         	if(conn!=null) {
         	if(conn!=null) {
         		conn.close();
         		conn.close();
+        		conn = null;
         	}
         	}
         } catch (SQLException e) {
         } catch (SQLException e) {
             e.printStackTrace();
             e.printStackTrace();
@@ -292,7 +333,10 @@ public class JdbcUtils {
 				prods.add(prodReq);
 				prods.add(prodReq);
 			}
 			}
 			ret.close();
 			ret.close();
-			conn.close();//关闭连接
+			// 共享连接不要在这里关闭,否则后续保存配置会写失败
+			if (stmt != null) {
+				stmt.close();
+			}
 		} catch (SQLException e1) {
 		} catch (SQLException e1) {
 			e1.printStackTrace();
 			e1.printStackTrace();
 		}
 		}