优化告警规则开发代码:提高可读性和安全性

以下是对现有代码的优化建议,旨在提高代码的可读性、安全性以及可维护性。

1. 变量声明优化

将所有的静态变量声明放到函数内部,避免全局变量污染和可能的并发问题。

public class RuleValueConfig {

    public static void CompareValue(String model, String devicename, String property, double value) throws Exception {
        // 将静态变量声明放到函数内部
        String a = null;
        String b = null;
        String c = null;
        String d = null;
        String e = null;
        String operation = null;
        Double defaultvalue = null;
        Integer operation_num = null;
        // ...
    }

    // ...
}

2. 数据库连接管理优化

将数据库连接和关闭的代码放到 try-with-resources 语句块中,避免忘记关闭资源。

public static void CompareValue(String model, String devicename, String property, double value) throws Exception {
    // 使用 try-with-resources 语句块管理数据库连接
    try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
         Statement stmt = conn.createStatement()) {
        // ...
    } catch (SQLException se) {
        // 处理 JDBC 错误
        se.printStackTrace();
    } catch (Exception e) {
        // 处理 Class.forName 错误
        e.printStackTrace();
    }
}

3. 使用 PreparedStatement 替换 Statement

使用 PreparedStatement 替换 Statement,避免 SQL 注入风险。

public static void CompareValue(String model, String devicename, String property, double value) throws Exception {
    try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
         PreparedStatement stmt = conn.prepareStatement('SELECT * FROM rule_kv WHERE model = ? AND device_name = ?')) {
        stmt.setString(1, model);
        stmt.setString(2, devicename);
        ResultSet rs = stmt.executeQuery();
        // ...
    } catch (SQLException se) {
        // 处理 JDBC 错误
        se.printStackTrace();
    } catch (Exception e) {
        // 处理 Class.forName 错误
        e.printStackTrace();
    }
}

4. 抽象查询结果处理逻辑

将查询结果的处理逻辑抽象成一个方法,避免重复代码。

private static void processResultSet(ResultSet rs) throws SQLException {
    while (rs.next()) {
        // 通过字段检索
        operation = rs.getString('operation');
        defaultvalue = rs.getDouble('defaultvalue');
        operation_num = rs.getInt('operation_num');
        // 判断是否超标产生告警的
        ModelNumInfor(operation, property, defaultvalue, value);
    }
}

public static void CompareValue(String model, String devicename, String property, double value) throws Exception {
    // ...
    processResultSet(rs);
    // ...
}

5. 使用占位符拼接 SQL

将字符串拼接 SQL 的方式改为使用 PreparedStatement 的占位符,避免 SQL 注入风险和字符串拼接错误。

public static void CompareValue(String model, String devicename, String property, double value) throws Exception {
    try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
         PreparedStatement stmt = conn.prepareStatement('SELECT * FROM rule_kv WHERE model = ? AND device_name = ?')) {
        stmt.setString(1, model);
        stmt.setString(2, devicename);
        ResultSet rs = stmt.executeQuery();
        // ...
    } catch (SQLException se) {
        // 处理 JDBC 错误
        se.printStackTrace();
    } catch (Exception e) {
        // 处理 Class.forName 错误
        e.printStackTrace();
    }
}

6. 拆分 CompareValue 方法

将 CompareValue 方法拆分成更小的方法,提高代码的可读性和可维护性。

private static void handleRule(String model, Integer operationNum) {
    if (model.equals('MAJOR') && operationNum == 1) {
        ModelNumOne();
    } else if (model.equals('MAJOR') && operationNum > 1) {
        ModelNumMore(value);
        a = null; b = null; c = null; d = null; e = null;
    }
    // ...
}

public static void CompareValue(String model, String devicename, String property, double value) throws Exception {
    // ...
    handleRule(model, operationNum);
    // ...
}

7. 提取常量

将一些魔法数字和字符串提取成常量,提高代码的可读性和可维护性。

private static final String JDBC_DRIVER = 'com.mysql.jdbc.Driver';
private static final String DB_URL = 'jdbc:mysql://47.114.102.84:3306/test?useSSL=false&useUnicode=true&characterEncoding=utf-8';
private static final String USER = 'root';
private static final String PASS = 'YWRtaW42NjY=mysql';
private static final String SQL_SELECT_RULE = 'SELECT * FROM rule_kv WHERE model = ? AND device_name = ?';

// ...

8. 添加注释

将一些代码块用注释标注,提高代码的可读性。

public static void CompareValue(String model, String devicename, String property, double value) throws Exception {
    // ...
    // 处理查询结果
    processResultSet(rs);
    // 根据规则类型处理告警
    handleRule(model, operationNum);
    // ...
}

9. 抽象重复逻辑

将一些重复的逻辑抽象成方法,避免重复代码。

private static void checkAndPrintAlert(String operation, String property, Double defaultvalue, Double value) {
    if (operation.equals('GREATER')) {
        // ...
    } else if (operation.equals('LESS')) {
        // ...
    } else if (operation.equals('GREATER_OR_EQUAL')) {
        // ...
    } else if (operation.equals('NOT_EQUAL')) {
        // ...
    } else if (operation.equals('LESS_OR_EQUAL')) {
        // ...
    }
}

public static void ModelNumInfor(String operation, String property, Double defaultvalue, Double value) {
    checkAndPrintAlert(operation, property, defaultvalue, value);
}

通过以上优化,代码将更加易于阅读、维护和扩展,并能更好地防止 SQL 注入攻击。建议您根据实际情况进行调整和完善。

注意:

  1. 在实际应用中,您可能需要使用更安全的密码存储方式,例如使用加密算法存储密码。
  2. 建议您使用日志记录功能,以便更好地跟踪代码执行情况和排查问题。
  3. 请根据您的实际需求选择合适的数据库连接池,以提高数据库连接的效率。
优化告警规则开发代码:提高可读性和安全性

原文地址: https://www.cveoy.top/t/topic/nbg0 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录