工作记录
程序员张某人
一枚软件开发工程师
展开
-
Non-static method ‘*‘ cannot be referenced from a static ..和@Resource注入到static抛出RuntimeExeption null
昨天开发遇到一个问题,场景是这样的,因为问题已经解决了,这里我就将代码还原,然后还原一下问题:我的原意是想在一个factory类中注入一个bean,MasterRpcServiceImpl已经交给容器管理了,且name就是masterRpcService,所以这么写看似是没问题的,可是呢?因为是factory类,它里面的方法大部分都是静态的,我要使用的方法刚好就是,这样就会导致什么问题呢?编译不过去这是最基本的问题,static方法中只能使用静态的变量,所以我就将masterRpcService变成原创 2021-10-22 10:14:33 · 730 阅读 · 0 评论 -
项目将com.thoughtworks.xstream升级到1.4.18遇到的问题:com.thoughtworks.xstream.security.ForbiddenClassException
项目开发需求将xstream从1.4.17升级到1.4.18,升级后遇到了序列化问题,描述如下:om.thoughtworks.xstream.security.ForbiddenClassException: com.jd.jcloud.wms.pickingplan.dto.eclp.SoOrderCancelReceiptat com.thoughtworks.xstream.security.NoTypePermission.allows(NoTypePermission.java:26) ~[原创 2021-09-01 18:57:55 · 7518 阅读 · 0 评论 -
合并问题汇总:dependency里面只能有一个exclusions
标题原创 2021-03-31 13:59:30 · 188 阅读 · 0 评论 -
代码合并问题:使用git的merge into current ,合并分支的时候需要注意的地方
这种问题,是因为粗心造成的,不过确实一不小心很容易犯,在此记录下,增强印象场景:在test分支,使用git的merge into current ,将master分支合并到test(需求较多,以及解决线上紧急问题时,然后没来得及合并到test分支上,导致test和master分支相差太大,有必要合并一下),合并时爆出的冲突问题都已经解决了,但是编译的时候出错了,在解决后。注意,我解决后,直接进行了push,因为merge的时候,git默认会commit,但是此时push的只是我merge的代码,编译出错原创 2021-03-31 14:18:32 · 19970 阅读 · 0 评论 -
MySQL 批量插入数据,单次插入多少条数据效率最高
参考博文https://blog.csdn.net/yangxiao_hui/article/details/103262704?utm_source=app&app_version=4.7.1原创 2021-05-25 09:00:15 · 567 阅读 · 0 评论 -
Long、Integer、Byte, Double, Float或 Short类型的比较
开发遇到的一些基础问题,记录一下:场景:比较Long类型的大小错误用法: == 或者 !=正确用法:Long.compareTo()解释:Long是一个引用类型,不能通过==进行比较大小,基本数据类型才可以,对于Long、Integer、Byte, Double, Float或 Short的Number类型,可以通过调用compareTo()来实现对象之间数值的比较,返回值是一个int,当源大于目标时,返回1,源等于目标返回0,源小于目标返回-1....原创 2021-05-25 08:39:58 · 879 阅读 · 0 评论 -
分割List为多份:Java中List.subList使用的陷阱
实际开发中,经常使用批量插入,但是sql有语句的长度限制,以及传输大小的限制,所以当我们要插入的每条数据很大时,就需要分多次进行批量插入,这个时候就需要将List集合进行分割。List分割的常用方式就是调用subList()方法,方法使用很简单,和...原创 2021-05-25 08:59:17 · 387 阅读 · 0 评论 -
Java AtomicLong addAndGet()用法
开发中遇到Java AtomicLong addAndGet()的使用,去Google后知道了其使用,记录一下。简单来说就是一个累计过程,在之前值的基础上累加指定的值,并返回。Java.util.concurrent.atomic.AtomicLong.addandget()是Java中的内置方法,该方法将在函数的参数中传递的值添加到先前的值,并返回数据类型为long的新更新值。用法:public final long addAndGet(long val)参数:该函数接受单个强制参数val,该参原创 2021-05-25 08:44:23 · 1931 阅读 · 0 评论 -
使用Map作为查询条件时的注意事项
实际的开发中,用到了map作为查询条件,当时直接创建一个map组装查询条件,然后放入dao层执行sql。后来在review代码的时候,有个前辈说,代码逻辑没问题,但是从代码的可读性角度来看,给组装map查询条件封装一个方法,参数就是我们要封装的查询条件,这样一来,从方法名、参数和返回值类型就可以很清楚的知道该方法是干嘛的,可读性就上来了,而且降低了代码的冗余,代码的结构也比较好。注:当时采用了前辈的建议,并和原来已存在的一个方法合并了一下,成为一个可拓展性更好的方法,避免重复造轮子。...原创 2021-05-06 09:14:47 · 604 阅读 · 1 评论 -
项目优化:一个服务调用另外一个服务接口超时优化(总结该类问题优化的思路)
场景订单发货时,需要调用调用称重接口进行运费的计算,里面原来的执行逻辑大致是这样的:调用一次数据库查询出来一个集合对象,我们假定它是List<A> aList,for循环aList集合,再根据每个a查询List<B> bList集合对象,然后调用运费计算接口(别的项目)的方法,运费获取后,创建一个需要更新数据库的对象C c,进行属性赋值,最后调用数据库更新。分析影响超时因素简单说,之所以调用“称重”接口超时,主要是因为该接口里面:1、使用for循环处理(当数据量)2、循环原创 2021-04-13 21:57:47 · 1129 阅读 · 2 评论 -
Java使用try--catch同时捕获多个异常,一起处理
实际开发中,有一个场景对两种异常做同样的处理,如果分开捕获的话,他们的代码处理逻辑是一样的,显得代码有点冗余,下面方法可以同时捕获多个异常,放在一起做处理:try { //捕获内容 } catch (IllegalArgumentException | BusinessException e) { //处理逻辑 } catch (Exception e) { //其他异常处理逻辑 }...原创 2021-03-30 08:59:40 · 18796 阅读 · 1 评论 -
mysql范围索引在实际开发中产生的问题
问题描述优化线上项目的时候,遇到一个问题:按照时间范围筛选数据的时候,查询出的数据不正确,但是清除时间条件后就可以。优化解决过程定位问题:定位到执行的sql,查看sql的执行过程,里面使用的是联合索引,且其中有个索引:create_time,我们知道time是范围性的,而范围查询可能会中断联合索引的使用。所以create_time后面的索引就用不到了,也就知道了数据查询错误。解决问题:在create_time作为索引是必要情况下,将create_time索引放在其他索引的最后。...原创 2021-04-13 21:21:28 · 73 阅读 · 0 评论 -
项目优化:当使用redis减少数据库压力时,遇到redis写入失败,造成读取数据问题的解决方案
场景:我们项目用到了mq,有一个专门的服务在跑异步任务去发mq,这个mq的数据不是从数据库里面查的,而是从redis里面取的,之所以这么做,有两个原因:1、使用redis减少数据库的压力;2、本来异步任务是放在生产环境中的,包括涉及的异步任务表,都是和生产环境在一起的,那么异步任务多的时候,就会对生产环境造成压力,比如数据库压力、cpu等,所以后来将异步任务专门抽成一个服务,并专门给该项目做一个异步任务数据库和表,就是为了减少生产环境的压力。生产环境通过redis将数据传递给异步任务服务。那么现在出原创 2021-04-13 22:21:12 · 2201 阅读 · 0 评论 -
BeanCopy和BeanCopier在实际开发中的使用(属性copy效率优化)
优化场景:项目的实体类主要分为三种:dto、dao、query等,所以属性copy避免不了,是影响代码执行效率的主要方面之一。当时的情况是,项目A接受url请求,然后会调用项目B的一个接口去处理明细数据(参数传递主数据,一条主数据对应多条明细数据),项目B处理数据的过程中涉及到属性的copy,而且是循环处理的(循环主数据),当项目A传入项目B的主数据比较多时,那么项目B处理的时间就比较长,而我们这边的服务与服务之间的调用是有时间限制的(我们这是30秒,一个接口处理时间超过30秒已经很长了,用户体验绝对是原创 2021-04-13 18:14:14 · 1360 阅读 · 0 评论 -
处理线上问题:自定义查询功能
最近解决一个问题,关于自定义查询的功能。背景:2017年写的代码,很早了,具体的需求内容也不清楚,从操作上可以推测出需求内容:用户点击新增自定义查询,弹窗一个框,里面是查询条件,选定好自定义的查询条件并输入查询名称,保存,生成一个自定义按钮,绑定到用户,下次就可以直接点击该自定义查询按钮,直接查询,不需要手动输入不同的查询条件;线上问题:新增自定义查询按钮后,不能立即点击使用、不能立即删除,需要重新加载页面才能点击和删除,但是当自定义查询名称包含特殊字符后,依然无法删除。分析问题:测试环境复现原创 2021-05-12 16:12:07 · 444 阅读 · 0 评论 -
取消订单的优化:使用forupdate行级锁+version
最近随着单量的新增,订单取消导致的并发问题开始出现,我们的取消逻辑是这样的:1、在发货之前都是可以取消的;2、针对不同阶段的取消执行不同的业务逻辑;3、有专门的表记录订单的状态流水:order_status,且和所有的订单状态更改放在一个事务中;4、通过version来控制订单的更新顺序;业务简介:1、订单的正常流程是:初始化完成 -> 定位中 -> 已定位 -> 拣货下发中 -> 已下发拣货任务 -> 已拣货 -> 已复核 -> 已发货以上也是原创 2021-08-31 21:22:55 · 617 阅读 · 2 评论 -
统一异常处理:基于xml的AOP统一异常处理
项目背景:2021年前半年主要处理一些线上Bug,2021下半年主要进行一些系统优化。项目比较老,处于升级ing,很多地方需要重构,其中有一些服务还没有前后端分离,依然使用tomcat,因为系统用户比较多,每日单量非常大,当线上前端出现一个异常信息时,若根据该信息去web搜索就会出现很多,(比如,租户给客服反应某某场景出现了‘系统异常’,然后值班人员去web搜索‘系统异常’的日志,会匹配很多日志,需要人力的筛选),给问题的定位带来了困难,为了提高问题定位的速度,后来架构组提出做三件事:1、去除原来自定义原创 2021-08-25 13:16:59 · 236 阅读 · 0 评论