开发踩坑记录

1.异步线程会脱离事务管控,导致查出来的数据不对

TmUserOrderDay tmUserOrderDay = new TmUserOrderDay();
 tmUserOrderDay.setStartDay(new Date());
 tmUserOrderDayMapper.insertSelective(tmUserOrderDay);
 Integer id = tmUserOrderDay.getId();
 CompletableFuture.runAsync(() -> {
     System.out.println("执行异步任务,id="+id);
     TmUserOrderDay tmUserOrderDay1 = tmUserOrderDayMapper.selectByPrimaryKey(id);
     System.out.printf("syncId is %s%n", tmUserOrderDay1.getId());
 }).exceptionally(e -> {
     e.printStackTrace();
     return null;
 });
 Thread.currentThread().sleep(2000);
 TmUserOrderDay tmUserOrderDay1 = tmUserOrderDayMapper.selectByPrimaryKey(id);
 System.out.printf("insert is %s%n", tmUserOrderDay1.getId());

插入后不能立马查到数据,因为事务没提交所以会报空指针

java.util.concurrent.CompletionException: java.lang.NullPointerException
	at java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:273)
	at java.util.concurrent.CompletableFuture.completeThrowable(CompletableFuture.java:280)
	at java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1629)
	at java.util.concurrent.CompletableFuture$AsyncRun.exec(CompletableFuture.java:1618)
	at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
	at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
	at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)
	at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)
Caused by: java.lang.NullPointerException
	at com.fangzhou.timesmilk.portal.OrderTest.lambda$getGetData$0(OrderTest.java:74)

2.Booealn 类型参数慎用

代码生成器 tinyint 会生成 Booealn 类型,或者请求参数定义了布尔类型,如果没写默认值很容易忽略空判断

 private Boolean isCreateUser;
 // 这样写会空指针
if ( order.getIsCreateUser()) {}
// 正确写法
if (null != order.getIsCreateUser() && order.getIsCreateUser()) {}
// 或者
if (Optional.ofNullable(order.getIsCreateUser()).orElse(false))
// 或者(推荐)
if (Boolean.TRUE.equals(order.getIsCreateUser())){}

3.线程资源不足导致跨域问题

在这里插入图片描述
由于说了5秒时间处理不了就直接返回,而且发送通知业务结果也不影响流程所以用了异步线程处理问题,然后直接立马返回,但是实际线上发现微信的这个通知非常非常频繁,不是只有在关注的时候才发一个通知,而是公众号的所有点击操作都会通知,所以导致线程一下子用关。用完后前端的 options 预请求被拒绝返回406,这个请求要返回跨域配置,如果处理不了,就没办法做跨域,就会报跨域的问题,问题如下(…重启服务器日志没了,算了下次遇到再说)

4.@JsonFormat 会有时区问题,默认少8个小时,加上了时区配置也没有用,所以以后请求中最后不让前端传递 Date 类型,而是传字符串,自己转换成 Date 类型就行

5.mapToDouble sum 计算会进度损失,正确做法,转换为 BigDecimal 后进行计算后再用 reduce 计算

BigDecimal sum = all.stream().map(DcGradeMoneyDetails::getMoney).reduce(new BigDecimal("0.0"), BigDecimal::add);

6.Optional 的 isPresent 方法空字符串的时候会判断为 ture

Optional<String> s = Optional.ofNullable("");
 if (s.isPresent()) {
     System.out.println("存在");
 } else {
     System.out.println("不存在");
 }

7.修改接口偷懒共有由于事务问题导致数据被覆盖回去

1).创建特殊订单->触发回调->修改某些字段
2).调用公共修改接口,查询了特殊订单的数据,赋值给请求参数,因为这些数据不能修改,但是原有公共接口前段传什么就会修改什么,此时回调没跑完查出来是旧的
3).回调跑完,数据更新成新的
4).公共修改接口跑完,数据被覆盖回去

8.遍历的同时修改导致并发异常

在这里插入图片描述
在这里插入图片描述
1)解决办法:使用 ConcurrentHashMap
2)定义新 map 装数据,最后合并两个 map 的数据

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值