开篇词 | 业务代码真的会有这么多坑?
该思维导图由 AI 生成,仅供参考
意识不到业务代码的坑,很危险
这个课程是什么?
学习课程的最佳方法
- 深入了解
- 翻译
- 解释
- 总结
这篇文章由贝壳金服的资深架构师朱晔撰写,分享了15年的工作经验和对业务代码中存在的各种坑的深刻认识。他指出业务代码中存在着许多潜在的问题和陷阱,可能导致线上事故、性能问题以及经济损失。文章列举了实际案例,强调了意识到这些坑的重要性。朱晔提出,要避免这些坑,首先需要了解它们的存在、位置和原因,而这正是他所提供的课程的主要内容。课程围绕Java业务开发中的坑点展开,涉及100个案例、约130个小坑,配合可执行的Demo演示,帮助开发者避免常见的陷阱,提供最佳实践。文章突出了作者的丰富经验和对技术问题的深刻洞察,对于开发人员来说具有很高的参考价值。朱晔建议学习者在阅读课程时实际运行调试源码、思考其他修正方式、阅读相关源码,并提供实践课后思考题,以提升自己的技术能力。整体而言,这篇文章为读者提供了一个深入学习业务代码中常见问题的机会,有助于提升技术水平和避免常见陷阱。
2020-03-09153人觉得很赞给文章提建议
《Java 业务开发常见错误 100 例》,新⼈⾸单¥59
全部留言(82)
- 最新
- 精选
- 老三分享一个我在菊花厂踩过的最大的坑, Android的. APP总是莫名其妙的报小概率IOException. 进一步分析是文件句柄被关闭了. 好好的为什么会被关闭呢? 原来是有人在别的位置将文件句柄传到JNI层(C语言)并close了, 原Java层也close了一遍. 话句话说, 有一个地方存在将文件句柄close过两次, 正常来讲也问题不大. 但是会存在小概率情况, 第一次关闭文件句柄之后, 系统将文件句柄指向的内存区域快速分配给第二个IO操作位置(同进程的, 但是代码完全不在一个位置), 而第二次关闭文件句柄, 会将重新分配后的close掉. 导致IOException
作者回复: 这个坑的确很深
2020-03-15262 - 第一装甲集群司令克莱斯特Executors.线程池工具类的几种创建线程池的方法,都不适合在生产高并发场景下使用,这是坑。
作者回复: 谢谢,专栏也有提到这个坑
2020-03-09425 - 李磊磊全是干货啊,比起“高大上”的架构,这些点滴问题的深入分析、应对,才真正考验 开发者的基本功
作者回复: 谢谢
2020-03-1319 - 终结者999号踩过的坑,老是忘记java中引用传递或值传递导致参数根本就没有被修改。。
作者回复: java只有按值传递,只不过引用类型传的值是指针地址,看上去像是传递引用。详细可以参考 https://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value?page=1&tab=votes#tab-top
2020-03-0918 - 钱晟龙🐲龍🐉使用rabbitmq消费消息,正常业务逻辑正常跑着,使用了ack机制。。 prefetch每台instance有一定的数量,测试环境测不出来都被消费了, 然而代码没有ack,线上去查,看到unack 几百条,队列积压几w。。。
作者回复: 使用mq一定要针对队列积压做好监控报警
2020-03-10214 - jjn0703踩过SimpleDateFormat的坑,当时企图用一个static的SimpleDateFormat对象通吃,结果再format之后,出现各种莫名其妙的时间
作者回复: 谢谢,专栏也有提到这个坑
2020-03-09511 - 楼下小黑哥原本想在发生异常的时候再次重试、然后写了一个while(true)。 写好上线确实也没问题,知道有一天,依赖出现问题,重试多少次都不行,这段代码就变成死循环了。就这样把 dubbo 调用者线程池耗尽。 原来老师以前是激战背后支撑者,以前开服抽奖的时候,还中过奖品,哈哈哈。
作者回复: 一般重试都是需要有次数限制,并且考虑指数避退策略,可以选择直接使用一些重试框架,比如spring retry
2020-03-11310 - yc同事踩过的坑:spring里通过配置文件注入了一个bean,配置是缺省,单线程下测试正常,多线程下各种异常,后来发现默认的bean是单例的,多线程调用线程不安全
作者回复: 这个点专栏中也会提到
2020-03-099 - 钱晟龙🐲龍🐉int batchSelectSize = 1000; List<Payment> payments = paymentMapper.findSpecificPayments(0,batchSelectSize); while (CollectionUtils.isNotEmpty(payments)) { List<OrderPayVo> orders = Lists.newArrayList(); buildData(payments, orders); orderPayBiz.syncSaveAuditOrder(orders); payments = paymentMapper.findSpecificPayments( payments.size(), batchSelectSize); } 批量处理分页条件有问题,只有被批量处理数据大于batchSelectSize的时候才会触发的坑 无限死循环调用syncSaveAuditOrder,内存疯狂增加。。
作者回复: 感谢分享
2020-03-108 - 6点无痛早起学习的和尚最近遇到一个坑,多线程情况下 log 日志部分丢失,用的 log4j2,本来想采用AsyncAppender,但是因为用的是封装的日志格式,AsyncAppender不行,最终也没有找到解决办法,就另辟蹊径把需求问题解决了,但是 log 日志部分丢失还是没有解决,Google 上 log4j2 log miss lose 都找了,没有找到解决办法,Stack Overflow 上说可能是因为 os/jvm 问题,频繁往一个 log 文件写东西
作者回复: 非异步日志的话丢失的问题不常见,尝试找一下规律,仅仅是文件日志丢丢失部分日志还是控制台也丢,多大并发会丢失
2020-03-1337