JAVA
文章平均质量分 95
原来是笑傲菌殿下
这个作者很懒,什么都没留下…
展开
-
【编程二三事】SQL是如何执行的?
Mysql是我们日常接触最多的一个开发组件了。但是,一个SQL是如何从我们的应用程序里传递到数据库里去的呢?数据库又是如何解析并处理这些SQL语句的呢?别急,让我给你一一道来。那么最后回顾总结下来,执行一句SQL语句大致要经过如下的步骤: 第一层需经过客户层,建立客户端与Mysql数据库之间的连接。其中,Mysql会通过连接池、数据缓存等方式,减少连接的耗时、查询的耗时。 第二层会经过服务层,该层主要针对用户输入的语句信息进行翻译、解析、校验等逻辑。依次对应于解析器、优化器、执行器。原创 2023-08-06 23:10:36 · 264 阅读 · 0 评论 -
【从零到Offer】- 泛型
文章从泛型的定义、用法和实现原理各方面介绍了泛型。通过更好的了解泛型,我们才能更合适的用好泛型,提高我们代码的优雅性和效率。原创 2023-04-12 10:18:58 · 257 阅读 · 0 评论 -
还苦于写接口文档?快试试javaDoc和Swagger
上文内容中主要介绍了两种编写接口文档的方式:javaDoc和Swagger。其中javaDoc由于其提示方式,更适用于后端间的接口编写。通过合适的javaDoc标记,可以很简单的标记出相关的枚举类、额外的文档信息等。 Swagger与javaDoc不同,其主要提供了一个在线的接口文档提供方式。在针对后端对前端提供文档的情况下,有较好的表现。通过简单的编写,就可以在项目启动后,提供一个完整的接口文档。 通过Swagger和javaDoc结合,我们就可以通过极少的代码,搭建出清晰易懂的接口文档。原创 2023-03-26 19:02:10 · 686 阅读 · 0 评论 -
SpringBoot异常处理?用这两个就够啦!
增强时机增强类型异同点@After后置增强目标方法执行之后调用增强方法@Before前置增强目标方法执行之前先调用增强方法返回增强目标方法执行return之后返回结果之前调用增强方法,如果出异常则不执行异常增强目标方法执行产生异常调用增强方法,需注意的是,处理后异常依旧会往上抛出,不会被catch。@Around环绕增强环绕增强包含前面四种增强,通过一定的try-catch处理,环绕类型可以替代上述的任意一种增强。原创 2023-03-12 12:55:03 · 325 阅读 · 0 评论 -
哦,原来事务传播是这样
在事务嵌套的情况下,事务如何从调用者往被调用者传播的机制。 首先,需要清楚的是,根据场景的不同,所需要使用的事务传播机制往往是不同的。比如对于数据强一致性的情况,我们希望这两个嵌套事务保持一致。但是对一些数据不需要保持强一致性的场景,我们可能希望两个事务间互不干扰。事务传播级别代码中的传播级别级别描述REQUIREDREQUIRED级别是Spring的默认事务级别,在Spring注释中对于该等级的描述是:会自动加入当前的事务,如果不存在则新建事务。SUPPORTS。原创 2022-12-25 17:12:06 · 351 阅读 · 0 评论 -
我悟了!Mysql事务隔离级别其实是这样!
介绍了这么多有关事务隔离的内容,我们终于可以回归到我们的问题上来了。那么其实对于开头提到的问题,原因就是在异步线程中,会新开一个事务,这两个事务是并行的。由于mysql默认的事务隔离级别是可重复读,会导致事务A异步的情况下,数据可能未提交,事务B执行较快而获取到了旧数据,造成了同步数据错误的问题。 知道了问题,那么解决方案就比较简单了,可以不通过异步的方式发送,而是采用kafka消息的机制。这样就给事务A留足了事务提交的时间,从而确保数据的准确同步。原创 2022-11-22 20:53:57 · 341 阅读 · 0 评论 -
浅析Spring事务实现原理
首先我们来了解下,最简单的事务是怎么实现的呢?以JDBC为例,当一个数据库Connection对象创建后,其会默认自动提交事务;每次执行SQL语句时,如果成功,就会向数据库自动提交,不能回滚。 通过调用setAutoCommit(false)方法可以取消自动提交事务。等到所有的SQL语句都执行成功后,调用commit()方法提交事务。如果其中某个操作失败或出现异常时,则调用rollback()方法回滚事务。原创 2022-11-08 18:24:31 · 656 阅读 · 0 评论 -
如何用IDEA提高你的开发效率
作为一名java开发工程师,IDEA无疑是我日常接触最多的工具。因此,能否高效使用IDEA软件,一定程度上决定了我们的开发效率。本文将主要介绍IDEA中的四个便于提高开发效率的功能,常用快捷键、实时模版、后缀补全、文件和代码模版。相信一定会对你提升开发效率有所帮助。 期望通过对IDEA上述进阶功能的学习,我们未来可以更好的驾驭IDEA的功能,让IDEA不仅仅是完成开发的工具,更应该成为我们提高生产效率的真正利器。毕竟打工路漫漫,能早开发完成就代表我们能多努(mo)力(yu)一点。祝各位永不加班~原创 2022-10-30 17:07:02 · 1183 阅读 · 0 评论 -
从一个主从延迟问题,学习Mysql主从复制原理
主从架构作为最常见的集群搭建模式,通过将读写分离,来避免所有的请求都请求到同一个数据库上,从而减少单个数据库的压力。其次,通过对从库进行水平的扩展,也会使得系统的伸缩性及负载能力得到提升。 一主一从为最常见的主从架构模式,由一个主节点+一个从节点组合而成,当主节点宕机时,从节点可以快速接替主节点的工作。 该架构有一个主节点+多个从节点组成,适合读较多的场景,可以将读命令分摊到多个从节点。 在一主多从的基础上,为了减轻主库向从库同步数据的压力,还出现了树状主从/级连复制。原创 2022-09-25 07:19:38 · 436 阅读 · 0 评论 -
关于我加了一行日志搞崩了服务这件小事
周三的时候,组内出现了一个线上问题,影响到了若干个用户的下单、支付等操作。然而实际查询到问题的原因时,发现只是由于一行小小的日志打印导致的错误。以下的文章内容分为主要分为三部分:1、对案件的发生进行回顾;2、分析案件发生的原因;3、对案件总结与反思以三章内容来回顾出现的问题,以及提供未来的预防策略。 在经历了这次惨痛的教训之后,有哪些是值得我们深入关注去思考和反思的呢?1、在编写方法的时候尽量避免才用getXXX、isXXX的方法进行书写,这会导致部分框架的解析出现问题。原创 2022-08-22 09:51:00 · 252 阅读 · 0 评论 -
从0-1了解Spring是如何运行起来的(四):BeanFactory后处理初分析,了解如何加载BeanDefinition
最深刻了解一个框架的思想的方式,莫过于看源码,本系列旨在于从Springboot底层源码(Version - 2.6.6)出发,一步步了解springboot是如何运行起来的。在前述的文章中,我们主要了解了SpringBoot是如何实现配置文件的加载、context的预处理.........原创 2022-07-03 17:15:28 · 252 阅读 · 0 评论 -
每天都在写Getter、Setter方法,我不耐烦了,于是用了神器MapperStruct,crud效率一下子提高了~
前言 相信绝大多数的业务开发同学,日常的工作都离不开写getter、setter方法。要么是将下游的RPC结果通过getter、setter方法进行获取组装。要么就是将自己系统内部的处理结果通过getter、setter方法处理成前端所需要的VO对象。public UserInfoVO originalCopyItem(UserDTO userDTO){ UserInfoVO userInfoVO = new UserInfoVO(); userInfoVO.setUserName(u原创 2022-05-29 20:33:30 · 700 阅读 · 0 评论 -
工厂模式:优雅地生成多种类型对象
工厂模式是一种非常常用的创建型设计模式,其提供了创建对象的最佳方式。在创建对象时,不会对客户端暴露对象的创建逻辑,而是通过使用共同的接口来创建对象。通过使用工厂模式,在业务代码中可以灵活的操控生成的实例对象。 工厂模式主要包含以下三种实现:简单工厂、工厂方法及抽象工厂。下面我们来逐一了解这三种工厂方法的实现与异同。简单工厂 工厂模式中,最简单易懂的就是简单工厂方法。通俗点来说,简单工厂的核心思想就是:“你告诉我你需要什么,我就为你生产什么”。这里举一个游戏的简单例子。一个游戏中角色分别有战士、原创 2022-04-17 18:47:46 · 750 阅读 · 0 评论 -
从0-1了解SpringBoot是如何运行起来的(二):定制你的banner
最深刻了解一个框架的思想的方式,莫过于看源码,本系列旨在于从Springboot底层源码(Version - 2.6.6)出发,一步步了解springboot是如何运行起来的。前言 上期我们聊了Spring是如何装配环境的。这期我们来接着往下看,一同来了解springBoot是如何加载出banner图片信息的。public ConfigurableApplicationContext run(String... args) { StopWatch stopWatch = ne原创 2022-04-10 17:20:26 · 590 阅读 · 0 评论 -
从0-1了解SpringBoot如何运行(一):Environment环境装配
前言最深刻了解一个框架的思想的方式,莫过于看源码,本系列旨在于从Springboot底层源码(Version - 2.6.6)出发,一步步了解springboot是如何运行起来的。public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args);}首先我们从run方法开始逐步深入其中。public ConfigurableApplicationContext run(St原创 2022-04-06 10:08:24 · 1245 阅读 · 0 评论 -
模版方法:优雅、灵活地拓展你的pipeline
模版方法,作为一种**行为型模式**,通过在抽象类或接口中定义一个操作中的算法骨架,而将一些步骤具体执行延迟到子类中实现,从而使得父类的方法执行可以获得不一样的结果。从而达到了代码复用、扩展性好、灵活度高的设计目的。原创 2022-03-27 15:14:44 · 334 阅读 · 0 评论 -
Spock框架初体验:更优雅地写好你的单元测试
随着情况的增多、if-else语句的增加,Junit带来的代码量会逐渐的增长,为后续的维护和情况的增加带来了一定的成本。针对这个痛点,Spock提出了自己的解决方案。其通过采用where语句的方式,简化了多if-else语句情况下的条件判断,进而简化了需编写的代码数量**。原创 2022-03-06 18:23:57 · 859 阅读 · 0 评论 -
多线程热知识(三):TransmittableThreadLocal,异步线程变量传递最优解
TTL通过将异步线程变量的传递时机由线程初始创建的时候,后移到了线程任务执行的时候。这样一来确保了线程变量即使在使用了线程池的时候也能够相应的传递下去。另外,采用了线程变量快照及重放的机制,避免了在高并发情况下可能出现的业务数据紊乱的问题,是很精妙的设计。原创 2022-02-24 10:39:14 · 1480 阅读 · 0 评论 -
多线程热知识(二):异步线程变量传递必知必会---InheritableThreadLocal及底层原理分析
在不依赖于线程池的场景下,ITL是一个很好的实现异步线程传递变量的工具。然而,在使用线程池的情况下,由于线程不会进行频繁地初始化和销毁等工作,ITL的变量值无法得到更新,因而有可能存在数据错误传递的问题。原创 2022-02-20 16:13:52 · 1238 阅读 · 0 评论 -
多线程热知识(一):ThreadLocal简介及底层原理
ThreadLocal作为一个多线程编程必不可少的元素,其通过对每个线程保存副本的方式,避免了互斥、同步等复杂操作。本文从底层源码逐步分析,为你揭开ThreadLocal的作用机理。同时探究引起ThreadLocal内存泄漏的本质原因,相信一定会让你受益良多。原创 2022-02-13 19:54:38 · 712 阅读 · 0 评论 -
初识分布式锁(三):Redis分布式锁原理及Redisson框架实战
前两篇文章咱们聊到了如何采用SQL数据库及Zookeeper实现相应的分布式锁。今天咱们再来聊聊如何采用redis实现相应的分布式锁,以及这种实现与前两种方式实现的差异性。原创 2022-02-09 11:15:20 · 1880 阅读 · 0 评论 -
初识分布式锁(一):分布式锁原理浅析及Mysql实现案例
什么是分布式锁?普通锁要讲分布式锁,我们先来了解下普通锁是什么。在计算机科学中,锁(lock)是一种同步机制,用于在许多线程执行时对资源的限制。通过使用锁,确保多个线程在访问同一个共享变量时,都能保持正确的访问顺序,不至于因为线程的争抢执行导致脏数据等问题的产生。具体来说,锁依据实现又可以分成:悲观锁、乐观锁、自选锁等多种,这里我就不赘述了。分布式锁现在咱们已经有了基本的锁概念了,那么为什么还需要设计分布式锁呢?以上图为例子,设计分布式锁的主要原因在于,普通锁只是针对单个系统下的多个线程的原创 2022-01-25 15:34:22 · 1279 阅读 · 0 评论