// 错误
if (projectId != null && projectId != item.getProjectId()) {
continue;
}
// 正确
if (projectId != null && !projectId.equals(item.getProjectId())) {
continue;
}
在我们平台上,这段代码执行没有问题,是因为我们的projectId比较小
public static void main(String[] args) {
Long a = 127L;
Long b = 127L;
Long c = new Long(127);
Long d = new Long(127);
Long e = Long.valueOf(127);
Long f = Long.valueOf(127);
System.out.println(a == b); // true
System.out.println(c == d); // false
System.out.println(e == f); // true
}
// 错误
gatewayInfo = this.nettyConfig.GATEWAY_INFO.get(sn);
// 正确
gatewayInfo = NettyConfig.GATEWAY_INFO.get(sn);
Object的equals方法容易抛空指针异常,应使用常量或确定有值的对象来调用equals
很多时候,这个问题在try catch捕获异常后,可能并不会对程序的正常运行产生问题,但是,抛出异常后直接进入catch,如果后面的程序中存在释放缓存等功能时,就有可能导致内存无法释放而OOM等问题。
// 错误
if (method.equals("REFRESH")) {
...
}
// 正确
if ("REFRESH".equals(method)) {
...
}
String[] args
// 错误
public static byte[] compressLzo(byte srcBytes[]) throws IOException {
...
}
// 错误
byte buf[] = new byte[1024];
// 正确
public static byte[] compressLzo(byte[] srcBytes) throws IOException {
...
}
// 正确
byte[] buf = new byte[1024];
缓存穿透指的是大量的请求越过缓存,直接命中数据库,导致数据库压力骤增,可能达到I/O瓶颈,出现数据库宕机。
下面举个例子,假如历史数据存储前,需要为每一条数据附加一个projectId: