![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
项目开发
大雄小方
想回到过去,试着让故事继续...
展开
-
Java web三大组件回顾
Java web三大组件回顾接触到了grpc相关的框架项目,项目中有一个微服务作为接受前端的http请求,再将请求进行处理过滤验证等操作后转发给其他对应的rpc服务接口。(此处是个人理解,有些形容可能不够恰当)看了这个接受请求的总服务相关的代码,查阅回顾了下相关的知识点。Java web三大组件ServletFilterListener其他HttpServletRequest...原创 2020-03-29 18:53:21 · 218 阅读 · 0 评论 -
前置拦截器的使用
前置拦截器的使用在项目开发中,想要实现一个防刷的功能,主要是通过在redis中缓存URL(path+userId)被某个用户访问次数的标记,当在规定时间内访问次数过多则会进行拒绝访问,防止恶意刷单破坏公平性,也过滤了一些访问底层数据库的无效操作。初步实现:刚开始是在控制层对应接口方法上加一层验证代码,这样导致了控制层代码显得很臃肿,而且如果其他方法也需要的相同的验证,还要再写一段类似的代码,...原创 2019-05-04 22:59:42 · 1342 阅读 · 0 评论 -
幂等操作的一些思考
幂等操作的一些思考总结一下关于幂等操作的思考什么是幂等操作?就是无论执行一次还是100次、1000次,所影响到的结果都是相同的,比如一般将HTTP中的GET、PUT、DELETE操作作为幂等操作,而POST是非幂等操作。如何避免非幂等操作?我结合我一个项目来总结一下:1、防止用户重复下订单:秒杀过程用户可能会由于兴奋或紧张导致重复点击下订单的按钮,这就可能导致重复下了多个一模一样的订...原创 2019-05-11 10:33:34 · 179 阅读 · 0 评论 -
MyBatis缓存机制
MyBatis缓存机制学习了关于Mybatis的一级缓存、二级缓存相关的知识,做一下总结…一级缓存:mybatis中一级缓存是一种基于sqlSession的缓存(是默认开启的,并且是无法关闭的,不过可以在select标签中的flushCache设置为true,使得查询都清除缓存)。一级缓存失效情况:不同sqlsession会导致一级缓存失效同一个sqlsession,但是查询条件不同...原创 2019-05-27 17:48:46 · 123 阅读 · 0 评论 -
Maven依赖构建版本冲突
Maven依赖构建版本冲突今天在做一个demo时遇到了一个asm包版本冲突的问题,寻找了相关解决方法在这里记录下–链接过程主要是想模拟一个Java虚拟机metaspace空间内存溢出的情况,需要使用到asm工具来循环创建多个类使得metaspace被撑爆来提示错误,再使用MAT工具来排查并定位问题,找到使内存溢出的代码位置。关于这个工具的使用和问题分析的整个过程我在另一篇博客会记录,这篇主要...原创 2019-06-10 15:34:35 · 218 阅读 · 0 评论 -
内存溢出问题定位
JVM内存溢出问题定位前言:内存溢出是程序运行中很常见的一个问题,导致这个问题发生的可能性也有很多,如内存分配不足或者内存泄漏等,如何定位到问题所在是非常重要的,至此记录一下关于定位内存溢出问题的方法与思路。(在实验过程出现了一个关于maven版本冲突的问题:解决链接)主要工具:jmap、mat工具步骤:先写出两个demo代码:一个不断创建对象导致堆内存溢出,一个不断创建类导致元空间内存...原创 2019-06-10 17:08:28 · 4013 阅读 · 0 评论 -
程序死循环、死锁问题定位
程序死循环、死锁问题定位在开发过程中,可能由于代码设计问题导致出现了死循环或者死锁的问题,使服务器CPU负载飙高从而导致系统运行缓慢,因此要特别注意防止死循环和死锁的发生。如监控服务器状态时,如果发现CPU负载或利用率飙得很高,这时候就要定位出可能出现的问题,这是在开发中非常重要的能力之一。主要方法:top 、jstack定位死循环模拟一段死循环代码(我这里参考了其他博客的代码来做实验...原创 2019-06-11 11:47:19 · 3762 阅读 · 0 评论 -
后台开发之设备通信
后台开发之设备通信最近接手了一个智能零售柜的项目,负责JAVA后台开发,在熟悉项目过程学习到了很多东西,从项目的框架设计也感受到了框架设计的艺术,比如拦截器、监听器、测试Mock模拟设备(mqtt协议)…还有许许多多可以吸收理解的,比如通过Mybatis plus实现自动生成文件功能、通过Shell脚本来提高开发效率…今天先记录下关于后台与设备通信之间的一些要注意的点。MQTT协议要实现后...原创 2019-07-28 23:46:04 · 853 阅读 · 0 评论 -
Netty实现websocket
Netty实现websocket项目中有一个需求,就是能够让服务端主动向客户端发送通知信息,大致过程如下门柜设备开门成功 -》返回开门成功信息给服务端 -》服务端返回ACK确认 -》服务端同时通知小程序用户开锁成功信息…由于需要服务端主动向客户端发送信息,这里可以使用websocket来实现,下面就来实现一个基于websocket的服务器的基本建立过程(这里使用的时Netty,其基于NIO,...原创 2019-08-05 00:03:58 · 739 阅读 · 0 评论 -
MQTT报文协议
MQTT报文协议之前一篇文章讲述了关于后台服务器和设备之间的通信的博客(链接),现在深入具体的协议报文以及一些代码实现。服务器发送报文根据topic区分设备和版本:报文头(区分报文是谁发送的):服务器上报设备上报数据区功能码(让设备要执行的一些操作)时间戳(校验发送与接收时间差,超时的就废弃掉)PID(流水号,识别整个流程)MID(信息号,区分信息发送顺序)数据长度...原创 2019-08-08 11:11:33 · 755 阅读 · 0 评论 -
实现Excel文件导入数据库
实现Excel文件导入数据库项目需求,要通过读取excel表的文件将数据导入到数据库,这里项目要求比较简单,不需要多个字段以及一些复杂的字符串判断,不过大体框架实现是差不多的,在这里记录下,以后应该需要的场景会比较多。//导入卡列表@Transactional@PostMapping("/card/import")public BaseResponse cardImport(@Reque...原创 2019-08-09 19:00:07 · 257 阅读 · 0 评论 -
交易精度相关
交易精度相关在项目开发中,在金钱交易模块方面发现了bug,在计算折扣优惠时会出现少一分的问题,后来分析应该是在精度计算上出错了。在后台进行金钱交易时,在JAVA中使用的是bigdecimal这个数据类型,保证金钱额度的准确性。不过在进行交易的时候,一般都是精确到分,所以要统一将结果精确到小数点后两位。为了达到代码复用,可以开发一个公用的精确数值小数位的方法。代码://此处还可方便直接使用...原创 2019-08-22 18:39:59 · 153 阅读 · 0 评论 -
定制HTTP消息转换器
定制HTTP消息转换器参考文章:将java实体对象转换成HTTP的数据输出流。Spring Boot底层通过HttpMessageConverters依靠Jackson库将Java实体类输出为JSON格式。当有多个转换器可用时,根据消息对象类型和需要的内容类型选择最适合的转换器使用。基于WebMvcConfigurerAdapter类中的configureMessageConverter...原创 2019-08-27 14:57:12 · 242 阅读 · 0 评论 -
spring声明式事务 同一类内方法调用事务失效
spring声明式事务 同一类内方法调用事务失效在项目开发中,检查代码流程时,被boss指出了一个潜在问题的代码 @Override public void closeCharge(String payNo){ logger.info("--------------------执行充值结算------------------------"); LsIdC...原创 2019-08-28 16:26:14 · 347 阅读 · 0 评论 -
MyBatis-plus缓存相关
MyBatis-plus缓存相关Mybatis有一级缓存、二级缓存,不过存在一些问题,最好使用第三方缓存,这里来记录下配置redis作为缓存。第三方缓存配置Cache实现类代码:public class RedisCache implements Cache { //实现类 private static final Logger logger = LoggerFactory...原创 2019-08-29 11:53:54 · 4620 阅读 · 0 评论 -
添加参数解析器
添加参数解析器在项目开发中,发现在controller层实现多个方法时,要传入的参数各不相同,可能需要对这些参数进行某些操作(比如通过request获取token,然后根据token获取对应的user对象),为了减少代码冗余,可以重写WebMvcConfigurerAdapter中的addArgumentResolvers(List<HandlerMethodArgumentResolve...原创 2019-04-19 21:29:30 · 354 阅读 · 0 评论 -
自定义注解
自定义注解看了一篇关于自定义注解的文章,mark一下链接原创 2019-04-19 11:17:46 · 141 阅读 · 0 评论 -
Spring开发Service层
使用枚举表示常量数据字段创建异常包(来检测事务是否执行顺利),要使用运行期异常,Spring只有运行期异常才回滚事务在并发量高的系统中事务控制1.保证事务方法的执行时间尽可能短,不要穿插其他网络操作RPC/HTTP请求或者剥离到事务方法外部2.不是所有的方法都需要事务,如只有一条修改操作,只读操作不要事务控制3.使用@Transactional注解事务logger测试为什么用IOC...原创 2019-03-31 22:07:50 · 2078 阅读 · 0 评论 -
SpringMVC之Controler层开发
SpringMVC之Controler层开发请求验证多的情况下可以用SpringMVC validcontroler层的作用:将用户输入的url进行解析找到本地对应的资源原创 2019-03-31 22:09:07 · 1482 阅读 · 0 评论 -
项目开发之Maven
项目开发之Mavenmaven的作用:不用手动去添加下载项目所依赖jar包,只需要通过maven进行配置,在pom.xml文件中配置所以依赖的包即可,降低了开发难度。导入过程:先从本地仓库找(可设置仓库位置),找不到后在向中央仓库找(可定义镜像仓库以提高访问速度)jar包的定位<dependency> <groupId></groupId> ...原创 2019-04-01 15:40:47 · 165 阅读 · 0 评论 -
Linux服务器问题
Ubuntu使用的问题转换镜像下载源如何将终端文件夹中文改为英文原创 2019-04-07 22:48:51 · 124 阅读 · 0 评论 -
项目开发之秒杀优化
项目开发之秒杀优化用CDN来储存静态资源智能DNS解析(nginx)用redis进行缓存,来减少数据库压力1.redis获取数据是没有序列化的,要自己序列化(从redis中获取后反序列化为对象,导入redis中序列化为字节流)2.热点数据放在redis中对表执行顺序进行调整:在一个事务中给表行加锁的时间尽量缩短使用数据库的存储过程(一般少用,简单的逻辑且并发要求高...原创 2019-04-09 10:43:16 · 167 阅读 · 0 评论 -
Fastjson的基本使用
fastjson的基本使用使用fastjson实现指定对象类型与String类型进行相互转换,在此记录下场景:在使用redis进行缓存操作时,由于jedis中的set(String key,String value),value值需要是String类型,所以需要将要储存的bean对象转化为String(建立一个beanToString方法)/***实现将java对象转化为Stri...原创 2019-04-09 16:40:10 · 362 阅读 · 0 评论 -
SpringBoot整合配置Mybatis、Redis
通过SpringBoot配置整合Mybatis、Redis学习SpringBoot框架,实操下整合配置Mybatis、redisSpringBoot配置步骤:首先创建Maven项目后在pom.xml文件配置Springboot依赖包(可在Springboot官方查询相关入门教程:入口)<?xml version="1.0" encoding="UTF-8"?><p...原创 2019-04-09 22:18:55 · 537 阅读 · 0 评论 -
数字公式验证码实现
数字公式验证码实现在实际场景中,为了防止用户用机器人刷单,一般都需要使用验证码功能,查了一些资料关于数字公式验证码的简单实现。生成验证码图片//生成验证码图片 public BufferedImage createVerifyCode(MiaoshaUser user, long goodsId) { if(user == null || goodsId <=0) { ...原创 2019-04-25 22:26:27 · 985 阅读 · 0 评论 -
高并发下出现超卖问题
高并发下出现超卖问题我在做秒杀项目过程中对超卖问题的一些总结1、增加库存表判断:并发情况下,库存判断与减库存的过程有线程安全问题,所以在最终进行减库存的时候,要多增加一个判断机制,判断当前库存是否小于0,因为Update操作会有行锁,所以可却确保线程安全,这样就可以防止库存出现负数情况。2、订单表设置联合唯一键:防止了库存为负数的情况,还需要防止一个用户重复秒杀商品的情况,可能用户同时发...原创 2019-04-27 17:01:29 · 2038 阅读 · 3 评论 -
Linux下运行jar包
linux系统运行环境搭建:先在Linux环境下建立java环境,参考链接打jar包,在cmd命令行项目目录中执行 mvn clean package然后将jar包上传到Linux系统,我这里使用的是Filezilla进行上传(usr/local/jar)运行jar包,我是用的是nohup java -jar XXX.jar & (其他启动方式参考)nohup命令及记录文件作用...原创 2019-04-27 20:24:03 · 192 阅读 · 0 评论 -
模拟压力测试报告
今天要将web应用在Linux环境下进行运行来进行压测,总结一下过程。压测工具:JMETElinux系统运行环境搭建:先在Linux环境下建立java环境,参考链接打jar包,在cmd命令行项目目录中执行 mvn clean package然后将jar包上传到Linux系统,我这里使用的是Filezilla进行上传(usr/local/jar)运行jar包,我是用的是nohup ja...原创 2019-04-28 09:30:49 · 3279 阅读 · 0 评论 -
InitializingBean接口使用
InitializingBean接口今天学习中想要实现一个将数据库的数据初始化到redis中,实现直接访问redis而减少数据库的访问压力,Spring中的InitializingBean可以实现在框架启动时自动初始化对于方法,通过实现这个接口中的afterPropertiesSet()方法来实现数据初始化过程。下面是具体实现。/** * 系统初始化 实现initialization接...原创 2019-04-23 16:58:52 · 417 阅读 · 0 评论 -
Spring与MyBatis开发DAO层总结
前言:先建立Maven,配置好pom.xml文件,将所依赖的包都导入Dao层开发基本步骤创建schema.sql文件来建立数据库以及表的设计,创建jdbc.properties来配置驱动、数据库url、数据库账户及密码建立好所对应的实体对象,设定好每个实体对象中需要的成员变量建立dao层操作的接口,待使用MyBatis来创建对应的配置文件实现这些接口创建mybatis-config.x...原创 2019-03-25 16:30:43 · 287 阅读 · 0 评论