采集网站会员,百度词条,平面设计网上自学,兰州建设厅评职称网站文章目录 1、线程池的使用2、MD5算法的使用3、多用枚举类 整理下近期干活儿遇到的一些坑。
1、线程池的使用
不合理点1#xff1a;jstack线程转储发现#xff0c;有几万个线程#xff0c;查看代码发现#xff0c;线程池放在方法内部或者循环体中创建#xff0c;尽管方法… 文章目录 1、线程池的使用2、MD5算法的使用3、多用枚举类 整理下近期干活儿遇到的一些坑。
1、线程池的使用
不合理点1jstack线程转储发现有几万个线程查看代码发现线程池放在方法内部或者循环体中创建尽管方法最后有shutdown关闭线程池但一定并发调用下线程数量会激增
改进使用成员变量放线程池
不合理点2:非单例Bean或者一个普通的类中线程池放成员变量了但没有static修饰正好其所在类被大量创建对象一个对象一个线程池大量线程池被创建 改进使用static修饰成员变量即某个属性所有对象都相同与之相反的是实例变量即某个属性一个对象一份如名字、身高
2、MD5算法的使用
不合理点调用一个三方接口有个请求参数accesskey其可能包含反斜线、等号等特殊字符直接传可能导致接口调用失败甚至SQL执行出错影响系统数据
改进:考虑做一个MD5加密输出一个定长字符串
补充关于MD5算法Message-Digest Algorithm 5可以将任意长度的数据映射为固定长度通常为128位的哈希值该过程不可逆无法从哈希值反推原始数据多用于数据完整性校验 输入任意长度的数据 → 经过多轮循环处理 → 输出固定长度的128位哈希值通常表示为32位十六进制字符串 需要注意MD5有安全性问题不同的输入可能生成相同的哈希值目前已构造出大量碰撞案例因此不适用于
密码存储应使用 bcrypt、Argon2 等算法。数字签名或高安全场景。
仅推荐用于非敏感数据的快速校验如文件完整性检查
3、多用枚举类
代码中多用枚举类代替直接创建的字符串常用的枚举形式一
public enum StatusEnum {SUCCESS,RUNNING
}//代替大量的SUCCESS字符串
StatusEnum.SUCCESS.name()形式二加一个display而不是name()后转小写更加有灵活性
Getter
public enum ClusterTypeEnum {RABBITMQ(rabbitmq),MQTT(mqtt);private final String displayName;ClusterTypeEnum(String displayName) {this.displayName displayName;}}形式三用于传参字段上直接将枚举类型和String在序列化和反序列化时自动转换如此Dto类中可以直接用枚举类型的变量而不再要求非得String同样的序列化时也会把枚举转成String
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;Getter
AllArgsConstructor
public enum OrderFieldEnum {CREATE_TIME(createTime, create_time),NAME(name,name);private final String value; //值private final String field; //对应数据库中的字段方便后面写业务和Mapper层代码private static final MapString, OrderFieldEnum map new HashMap();//JsonCreator标记一个构造函数或静态工厂方法告诉 Jackson 在反序列化 JSON 时应该调用该方法来创建对象实例。JsonCreatorpublic static OrderFieldEnum check(String value) {//这里的判断map为空则遍历枚举类的值放进Map中//这个操作和上面的利用类加载时机初始化Map集合一个目的if (map.isEmpty()) {for (OrderFieldEnum orderFieldEnum : OrderFieldEnum.values()) {map.put(orderFieldEnum.getValue(), orderFieldEnum);}}//如果在Map中找不到对应的key和传入的字段相等则认为非法传参即不支持这个排序字段if (!map.containsKey(value)) {throw new MyExceptionHandler(不支持这个排序字段); //自定义异常在全局异常处理器处理}//否则返回整个枚举对象return map.get(value);}//JsonValue标记一个方法将该方法的返回值直接作为 JSON 的值而不是将整个对象序列化为 JSON 对象//使用场景当某个类本身不需要完整的 JSON 表示只需要输出其中一个字段的值时JsonValuepublic String getValue() {return value;}
}
详见https://llg-notes.blog.csdn.net/article/details/130997300