Java Web技术经验总结(十一)

  1. Git工作流:Git 工作流程
  2. Maven版本管理:阅读Maven最佳实践:版本管理
  3. lombok project,在Java开发中,我们常常需要写很多令人厌烦的getter/setter代码、需要自己覆盖equals、toString和hashcode等方法,不胜其烦且容易出错。lombok就是为此而生的,通过给bean类添加一些注解,可以自动生成上述函数。不过在我过去的开发中,如果需要定制自己的equals方法,我常常使用Apache Commons中提供的EqualsBuilder和HashCodeBuilder两个类,参考:Java 中正确使用 hashCode 和 equals 方法。PS:lombok我刚刚接触,还不清楚它是否也有定制具体实现的功能;PS2:在IDEA中使用lombok需要安装对应的插件,参考:lombok在IntelliJ IDEA下的使用
  4. MySQL的主从延迟和解决方案:MySQL主从数据库同步延迟问题解决
  5. 来自《Effective Java》中的第6条规则:内存泄漏的另一个来源是缓存。一旦你将对象引用放在缓存中,它就很容易被忘掉,从而使得它在不再有用之后很长一段时间仍然留在缓存中。这种情况下,可以使用WeakHashMap代表缓存,只要在缓存外存在某个像的键的引用,该项就有意义;当缓存项的键的生命周期结束后,该项也会自动被删除。关于WeakHashMap,可以参考这篇文章:深入理解WeakHashMap。
  6. 关于Code Review的一篇文章:说说Code Review,其中不仅讲了code review,还讲了带新人的方法。另外,关于这个主题,可以参考《Clean Code》和《重构》这两本书。
  7. 实现分布式锁的方法,这篇文章讲得很详细:分布式锁1 Java常用技术方案
  8. 使用Intelij IDEA中的git插件进行分支合并的步骤(例如:branch1合并到branch2):
  • 切换到目标分支,branch2
  • 在右下角git快捷窗口——>branch1——>merge,就会将branch1合并到branch2。


    Java Web技术经验总结(十一)_第1张图片
    快捷合并分支1

    分支合并结果
  1. 这两天遇到一个业务场景:一个数据库修改的请求,客户端由于历史原因,经常会发出两个完全相同的请求,导致服务端发生唯一键冲突。为了解决这个问题,我们决定使用分布式锁解决这个问题,在进行数据库插入操作之前要先拿分布式锁,拿到锁以后也要先检查数据库,没有的话再插入数据。
    我在测试的时候发现分布式锁不起作用,先是以为自己的锁有问题,排除这个问题之后,开始回顾之前的代码。发现一个坑:原有的代码在接口定义层用了@Transactional注解,Spring中的事务是基于AOP实现的,如果在RPC接口使用事务注解,那么事务会在RPC接口返回之后才会提交。可以看出,当事务的范围大于同步代码块的范围时会有问题。A请求释放了锁,但是它的事务还没有提交;B请求已经拿到了锁,但是看不到A请求的事务修改的东西,导致脏读。
    关于Spring中的事务,可以参考官方文档。
    我的经验是:(1)只有某个业务要求同时修改两张以上的表的数据的时候,再使用事务,并且要在方法级别使用;(2)事务和同步代码块不可嵌套使用。

本号专注于后端技术、JVM问题排查和优化、Java面试题、个人成长和自我管理等主题,为读者提供一线开发者的工作和成长经验,期待你能在这里有所收获。


Java Web技术经验总结(十一)_第2张图片
javaadu

你可能感兴趣的:(Java Web技术经验总结(十一))