Java常见CodeReview及编码规范

鉴于自己的开发经验,以及常见容易产生bug及性能问题的点做个记录.

1.数据库

如果开发人员的经验不足,Java通过ORM(Mybatis)对数据库的操作的性能问题比较隐蔽.因为不压测或者异常case没发生的时候一般发现不了问题.特别是异常case发生的时候.

  1. 除配置表以外的sql都要经过explain分析表扫描范围.必须控制在range级别及以下
  2. Mybatis防sql注入: #{}传入的参数在SQL中显示为字符串,#{}方式能够很大程度防止sql注入.${}传入的参数在SqL中直接显示为传入的值,${}方式无法防止Sql注入
  3. selectList之类的操作,必须要限定返回的行数.有时候没有条件传入很可能就是全表扫描返回了.
  4. Mybatis的LambdaQueryWrapper的 in()函数入参有上限.超过则会报错
  5. 禁止多表联合join
  6. 多多利用主键索引或唯一索引提升查询效率
  7. 用批量插入代替循环迭代插入
  8. 表设计时,后期若有分库分表需求的,主键不可使用自增id,不方便迁移数据.可以使用分布式主键生成器,例如Snowflake算法生成的ID
  9. 表设计时,建立合理的联合索引,覆盖索引,最大程度覆盖查询需求
  10. 表设计时,尽量不要允许null值,状态类字段用精简的字符串枚举
  11. 查询数据库数据只返回必要的字段,一般不使用select *

2.Java基础API

  1. HashMap迭代使用entrySet() 获取Map 的key 和value
  2. 使用Collection.isEmpty()而不是Collection.size()来判空, O(1)
  3. 初始化集合,Map,队列一般都要指定初始大小.谨慎使用无界队列
  4. 使用StringBuilder 拼接字符串
  5. 字符串转化使用String.valueOf(value),可以避免NPE
  6. 方法返回值不要返回null,返回空集合或者对象都行
  7. 使用equals方法时,常量放前面
  8. 尽量不要出现魔法值,多多使用枚举,枚举的属性字段必须是私有且不可变
  9. 工具类设计成单例或者池化,工具类中屏蔽(private)构造函数
  10. 使用线程池时要注意队列大小以及拒绝策略,若发生拒绝时该如何保证业务逻辑原子性
  11. 若使用http调用必须要有超时限制,以及超时处理
  12. 加锁时,专锁专用,顺序加锁,避免死锁发生的可能
  13. 使用线程池配合ThreadLocal时养成remove的习惯,规避潜在的溢出风险

3.Spring

  1. 事务失效问题,注意事务传播特性,特别注意嵌套方法catch异常的问题,导致业务数据不完整
  2. 避免大事务
  3. 分布式事务影响性能,可以选择无事务的最终一致性实现
  4. 使用构造函数注入而不是字段注入,以提高代码的可测试性和可维护性
  5. 有大量的@Scheduled任务需要同一时刻执行时,调大默认Scheduled线程的数量.否则可能会导致一些任务阻塞住
  6. 避免频繁的对象创建和销毁,使用合适的对象池或缓存
  7. 关键日志信息打印,合理使用日志级别.代码注释完备

4.性能提升

  1. 比较重要的就是接口性能优化,利用并发工具类等手段提升接口响应时间.比如用completeFuture CountDownLatch等并发处理业务数据
  2. 涉及其他服务调用的接口,必须有快速熔断,不能因为上游服务的问题影响本身的服务.需要充分考虑别的服务返回给自身的数据异常的情况
  3. 利用分布式缓存提升接口性能
  4. 可以异步执行的逻辑可以放到消息队列或异步线程.让当前接口快速响应.提升用户体验
  5. 代码实现选用业界最佳实践,比如用Disruptor队列替代ArrayBlockingQueue
  6. 多多了解各个场景的业界最佳实践,比如用NIO替代AIO

5.设计实现

  1. 接口设计实现是否符合单一职责、开闭原则等设计原则
  2. 使用接口而不是具体实现进行注入,以降低耦合性
  3. 是否有冗余、重复的代码,是否可以进行重构
  4. 代码设计实现尽量符合设计模式,提升健壮性和可维护性
  5. 沉淀基础能力,不要重复造轮子.比如动态线程池工具,分布式锁工具 可以封装成Springboot starter包.一键式装配应用

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/210947.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mongodb 开启oplog,java监听oplog并写入关系型数据库

开启Oplog windows mongodb bin目录下找到配置文件/bin/mongod.cfg,配置如下: replication:replSetName: localoplogSizeMB: 1024双击mongo.exe 执行 rs.initiate({_id: "local", members: [{_id: 0, host: "localhost:27017"}]})若出现如…

Android : 篮球记分器app _简单应用

示例图: 1.导包 在build.gradle 中 加入 // 使用androidx版本库implementation androidx.lifecycle:lifecycle-extensions:2.1.0-alpha03 2. 开启dataBinding android{...// 步骤1.开启data bindingdataBinding {enabled true}...} 3.写个类继承 ViewModel pac…

消息中间件之间的区别

一.单机吞吐量 ActiveMQ:万级,吞吐量比RocketMQ和Kafka要低了一个数量级 RabbitMQ:万级,吞吐量比RocketMQ和Kafka要低了一个数量级 RocketMQ:10万级,RocketMQ也是可以支撑高吞吐的一种MQ Kafka&#xff…

Linux服务器部署XXL-JOB

参考文档及下载地址:分布式任务调度平台XXL-JOB 1 从git拉取XXL-JOB代码 我们的大部分变动,是发生在xxl-job-admin,最终将这个模块打包成jar包部署在linux服务器上。 2 执行数据库脚本 doc\db\tables_xxl_job.sql 3 修改pom文件&#xff0c…

Siemens-NXUG二次开发-打开与关闭prt文件[Python UF][20231206]

Siemens-NXUG二次开发-打开与关闭prt文件[Python UF][20231206] 1.python uf函数1.1 NXOpen.UF.Part.Open1.2 NXOpen.UF.Part.LoadStatus1.3 NXOpen.UF.Part.Close1.4 NXOpen.UF.Part.AskUnits 2.示例代码3.运行结果3.1 内部模式3.2 外部模式 1.python uf函数 1.1 NXOpen.UF.P…

CUDA简介——Grid和Block内Thread索引

1. 引言 前序博客: CUDA简介——基本概念CUDA简介——编程模式CUDA简介——For循环并行化 Thread Index: 每个Thread都有其thread index。 在Kernel中,可通过内置的threadIdx变量来获取其thread index。threadIdx为三维的,有相…

一. 初识数据结构和算法

数据结构与算法是一个达到高级程序员的敲门砖。当你脱离了语言的应用层面,去思考他的设计层面时,你就依旧已经开始初识数据结构与算法了 数据结构 什么是数据结构 对于数据结构的定义官方并没有统一的解释,在各个百科以及算法的书中&#xf…

MicroPython标准库

MicroPython标准库 arraybinascii(二进制/ASCII转换)builtins – 内置函数和异常cmath – 复数的数学函数collections – 集合和容器类型errno – 系统错误代码gc – 控制垃圾收集器hashlib – 散列算法heapq – 堆队列算法io – 输入/输出流json – JSON 编码和解码math – 数…

《微信小程序开发从入门到实战》学习四十一

4.3 云开发文件存储 文件存储功能支持将任意数量和格式的文件(如图片和视频)保存在云端,支持 以文件夹的形式将文件归类。 在云开发控制台中,可以对云端保存的文件进行管理。 也可以通过文件存储API对文件进行上传、删除、移动…

SA与NSA网络架构的区别

SA与NSA网络架构的区别 1. 三大运营商网络制式:2. 5G组网方式及业务特性3. NSA-3系列4. NSA—4系列5. NSA-7系列6. 5G SA网络架构7. 运营商策略 1. 三大运营商网络制式: 联通:3G(WCDMA)\4G(FDD-LTE/TD-LTE)\5G(SA/NSA)移动:2G(GS…

如何购买华为云服务器

华为云是华为推出的云计算服务平台,旨在为企业和个人提供全面的云端解决方案。它提供了包括计算、存储、数据库、人工智能、大数据、安全等多种云服务,覆盖了基础设施、平台和软件级别的需求。华为云致力于构建安全可信赖的云计算基础设施,以…

数据库Delete的多种用法

数据库的Delete操作是用来删除数据库中的数据记录的,它是数据库操作中的一种重要操作,能够帮助用户删除不需要的数据,以便保持数据库的整洁和高效。在使用Delete操作时,需要注意确保操作的准确性和安全性,以免误删重要…

AI助力智慧农业,基于YOLOv3开发构建农田场景下的庄稼作物、田间杂草智能检测识别系统

智慧农业随着数字化信息化浪潮的演变有了新的定义,在前面的系列博文中,我们从一些现实世界里面的所见所想所感进行了很多对应的实践,感兴趣的话可以自行移步阅读即可: 《自建数据集,基于YOLOv7开发构建农田场景下杂草…

数电笔记之寄存器

数电 1 数字电路基础 1.2 二进制数据表达 1.2.1 二进制简介 1.2.2 用二进制表达文字 常用的中文字符集:GBK,UTF8 1.2.3 用二进制表达图片 图片像素化,像素数字化 1.2.4 用二进制表达声音 1.2.5 用二进制表达视频 1.3 数字电路 1.3…

Python与PHP:编写大型爬虫的适用性比较

目录 一、引言 二、Python编写爬虫的优势 1、强大的数据处理能力 2、丰富的网络库和框架 3、良好的可读性和易维护性 4、社区支持和生态系统 三、PHP编写爬虫的优势 1、简单易学 2、广泛的应用领域 3、高效的性能 4、灵活的请求处理方式 四、大型爬虫的编写实例&am…

JavaScript <md5加密的两种不同输出结果分析>--案例(二点一)

前言: 问题是这样的,在浏览器中看到这段代码 然后在控制台进行输出.得到: 紧接着,就在,js文件里面进行转译: 可是,得到的结果是: 这是问题!!! 正题: 为什么相同的js代码,在 .js 文件中的输出与 Chrome 控制台中的输出不一样? 环境差异:不同的JavaScript环境&…

Linux使用root用户安装完MySQL软件后,配置MySQL这个普通用户登录

在 Linux 系统中,当您使用 root 用户安装 MySQL 后,系统会自动创建一个名为 mysql 的系统用户。这个 mysql 用户主要用于管理 MySQL 服务的运行,通常是没有登录系统的权限的。如果您希望使这个 mysql 用户能够登录到系统,您需要设…

Android 12.0 Folder文件夹全屏后文件夹图标列表居中时拖拽app到桌面的优化

1.概述 在12.0的系统rom产品开发中,在Launcher3中在目前的产品需求开发中,对于Launcher3中的文件夹Folder的布局UI 进行了定制化的需求要求把Folder修改为全屏,然后在中间显示文件夹图标的列表,这时候如果Folder是全屏的话,如果拖拽文件夹列表中的app图标,只有拖拽 到屏…

【数据结构实验】树(一)构建二叉查找树(BST)

文章目录 1. 引言2. 二叉查找树3. 实验内容3.1 实验题目(一)输入要求(二)输出要求 3.2 算法实现1. 数据结构2. 全局变量3. 中序遍历函数InOrder4. 二叉查找树的构建函数T5. 主函数 3.3 代码整合 4. 实验结果 1. 引言 二叉查找树&a…

ntopng如何将漏洞扫描与流量监控相结合,以提高网络安全性

来源:艾特保IT 虹科干货 | ntopng如何将漏洞扫描与流量监控相结合,以提高网络安全性 欢迎关注虹科,为您提供最新资讯! ntopng为人所知的“身份”是被动流量监控。然而,如今的ntopng6.0也进化出主动监控功能来&#xf…