自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(22)
  • 收藏
  • 关注

原创 spring-kafka通过@KafkaListener实现消费者监听流程分析

首先通过@EnableKafka注解,注入KafkaBootstrapConfiguration类@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Import(KafkaBootstrapConfiguration.class)public @interface EnableKafka {}注入KafkaListenerAnnotationBeanPostProcessor,此类负责收集有@Kaf

2020-06-23 15:07:17 10876 2

原创 MyBatis初始化全流程解析

Mybatis是一款非常值得我们学习的优秀开源框架,并且源码相对其他框架来说比较通俗易懂,代码层级也不深,我认为将他作为入门级的源码学习框架非常合适,本文将通过分析MyBatis初始化流程让大家能够先理清大致的脉络。初始化流程最终需要我们拿到SqlSessionFactory对象,根据config文件生成SqlSessionFactory对象,从这个对象中获取SqlSession,然后查询数据。public interface SqlSessionFactory { SqlSession open

2020-06-30 19:33:26 2445 1

原创 @Transactional注解事务失效的七种原因分析

1、异常被捕获后没有抛出2、抛出非运行时异常3、方法内部直接调用4、新开启一个线程5、非public的方法6、数据库本身不支持7、事务传播级别设置错误

2020-06-29 20:11:44 16065 7

原创 Kafka生产者发送消息的方式解析

kafka生产者为我们提供了三种发送消息的方式。

2020-06-28 22:07:53 3158

原创 Volatile关键字特性详解

volatile是一种轻量级的同步机制,不会引起的线程上下文切换,可以保证可见性和禁止重排序,但不能保证原子性带来的线程安全问题。volatile特性可见性当有多个线程访问同一个变量时,一个线程对此变量的修改,其他线程应该立刻可获取到修改后的值。一个变量用volatile修饰后,当对此变量写入时,会立刻将写入后的值刷新到主存中,并且将其他线程本地内存中保存的值失效,其他线程读取此变量时,会直接从主内存中读取。public class VolatileDemo { private stati

2020-06-28 19:59:27 3814

原创 CountDownLatch、Semaphore、CyclicBarrier应用与解析

CountDownLatchCountDownLatch能够实现让某一个线程等待其他线程执行完成后再执行,比如多个线程负责计算各自的数据,数据之间没有联系,一个线程等待所有线程都计算完后进行数据的汇总。传统的串行执行的方式,假设线程A/B/C分别进行计算,再由D线程汇总数据,总共耗时7秒。但是如果A/B/C计算之间并没有任何依赖关系,那么就可以让他们同时进行计算,线程D等待所有线程都执行完之后再进行汇总,这样总共耗时就只需4秒。当然除了CountDownLatch,还有其他的一些方法也能实现类似的效

2020-06-26 20:35:40 2284

原创 Kafka和SpringBoot整合

Kafka和SpringBoot整合

2020-06-23 15:11:41 3636

原创 MySQL建立索引的注意事项

大家都知道对数据库表字段建立索引可以有效的提升数据的查询效率,但索引也不是随便建立的,需要我们对建立索引的规范有一定的了解,才能更好的发挥出索引的优势,避免因为滥建索引反而带来整体性能的下降。1、哪些列上建立索引?一般我们会建议在经常被查询的列上建立索引,但也需要注意如果该列更新比较频繁或者区分度不高(比如只有一个状态0/1的标识),那么就需要考虑是否值得建立索引了。在更新比较频繁的列上建立索引,会降低更新时的效率,因为每次更新都需要对索引的存储进行维护。一般经常被查询的列、排序的列、关联查询的列、

2020-06-22 17:22:48 3890

原创 JDK提供的线程池详解

为什么要使用线程池?减少不必要的资源消耗,将线程交由线程池管理,可以有效的避免线程的频繁创建与销毁。可以有效的对线程的数量进行控制,避免创建过多的线程导致系统资源被大量消耗,反而降低系统的响应时间。JDK中线程池的核心参数定义corePoolSize核心线程数,即线程池始终保持着corePoolSize个线程数。maximumPoolSize线程池中最多允许创建maximumPoolSize个线程。keepAliveTime假设corePoolSize是5,maximumPoolSiz

2020-06-22 14:40:29 2093

原创 wait和sleep使用的区别和注意

2020-06-19 13:55:37 2045

原创 sonar对于处理InterruptedException异常提示的原因分析

当我们使用会抛出InterruptedException异常的方法时,如果处理不当可能会发生一些预期之外的问题。下面看一段代码演示:public class ThreadInterruptedDemo { public static void main(String[] args) throws InterruptedException { Thread myThread = new MyThread(); myThread.setName("my thread

2020-06-18 17:18:36 5340

原创 ThreadLocal存储结构及内存溢出问题分析

ThreadLocal是为了解决多线程并发访问共享变量时造成数据异常的问题,与加锁的思想方式不同,ThreadLocal是通过为每个线程提供一个变量的副本,以此保证并发访问的安全。先看一下在没有使用ThreadLocal的情况下对于共享变量的访问结果:/** * 启动两个线程,各执行100次对共享变量count加1,得到的结果可能并不是200,而是一个无法确定的数 */public class NoUseThreadLocal { static int count = 0; pu

2020-06-17 22:29:46 2942

原创 MySql索引失效的几种原因分析

1、联合索引不满足最左匹配原则2、隐式转换3、like查询4、索引列null值字段5、优化器6、索引列存在运算

2020-06-16 10:21:48 3387

原创 HashMap1.8源码深入分析

在分析源码之前有必要先了解一下HashMap的数据结构数据结构清除后再了解几个重要的属性1、DEFAULT_INITIAL_CAPACITYCAPACITY可以理解hashmap槽的数量,table长度,默认为16,且必须为2的次方。static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16HashMap的几种构造方法1、无参构造方法,也是我们最常用的方法所有属性都为默认值public HashMap() {

2020-06-15 15:24:39 2409

原创 利用mybatis插件功能实现慢sql监控

首先在mybatis全局配置文件中加入如下配置。<plugins> //自定义的插件类 <plugin interceptor="com.wyl.mybatis.Interceptors.ThresholdInterceptor"> //定义一个属性值用来配置慢sql的时间 <property name="slowSqlTime" value="10000"/> </plugin></plugins>自定义插件类,配置拦截的方

2020-06-11 15:55:22 4958 1

原创 Mybatis中用到的设计模式

Mybatis是一款非常值得我们学习的优秀的开源框架,本文将通过分析mybatis源码,看看到底用到了哪些设计模式,以及如何把这些高大上的设计模式优雅的运用到实际的项目中去的!建造者模式意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。主要解决:主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。何时使用:一些基本部件不会变

2020-06-09 20:22:55 2693

原创 Mybatis二级缓存源码分析

本文中有些内容与之前关于一级缓存分析的文章中,有部分内容相似,所以有些会直接跳过,建议可以先看看关于一级缓存分析的文章一级缓存源码分析二级缓存生命周期mybatis一级缓存生命周期是sqlSession级别,二级缓存生命周期是sqlSessionFactory级别,也就是整个应用级别的生命周期。如何开启二级缓存mybatis二级缓存与一级缓存不同,需要先在全局配置文件中配置,默认开启<setting name="cacheEnabled" value="true" />还需要在ma

2020-06-08 21:38:24 2587

原创 Mybatis一级缓存源码分析与效果演示

一级缓存生命周期在mybatis中一级缓存是默认开启的,无需添加任何配置属性,一级缓存的生命周期默认是SqlSession级别的,也就是一次数据库会话级别的存在,不同的会话不能共享一级缓存。一级缓存何时失效?因为生命周期是SqlSession级别的,自然SqlSession关闭缓存失效调用SqlSession.clearCache方法增删改操作会清空缓存mapper文件中的配置flushCache为false<select id="xxx" resultType="xxx" flus

2020-06-05 17:10:38 2521

原创 Mybatis插件原理与实战案例分享

本文主要会结合源码来分析mybatis插件的实现原理,然后再通过案例帮助我们更好的进行理解。首先看一下插件是如何被扫描到的要想在mybatis中使用插件,必须要先在配置文件进行配置,参考如下。<plugins> <plugin interceptor="com.mybatis.interceptors.SlowSqlInterceptor"> <property name="slowSqlTime" value="1"/> </plugin>&

2020-06-03 15:18:26 2625

原创 Mybatis自带连接池源码解析

Mybatis默认为我们提供了一套连接池实现。核心属性:poolMaximumActiveConnections连接池最大活跃连接数,默认为10个。poolMaximumIdleConnections连接池最大空闲连接数,默认为5个。poolMaximumCheckoutTime最大可回收时间,当活跃连接数达到上限时,如果此时有连接请求,则会检查当前活跃连接列表中最早的那个连接是否超过这个时间,默认为20s。poolTimeToWait连接数满了,也没有连接超时,当前连接等待这个时间后,再

2020-06-02 13:41:05 3169

原创 Mybatis源码分析高频面试题-如何实现直接调用接口方法的

先了解一下在mybatis原生方式中如何使用接口调用。//从sqlSession中获取对应的mapper,参数为Mapper的Class对象UserMapper mapper = sqlSession.getMapper(UserMapper.class);//然后就可以直接调用接口方法了User user = mapper.selectById(1);从使用方式可以看出,首先是调用sqlSession.getMapper(UserMapper.class)这个方法,并且需要传入Mapper的C

2020-06-01 15:46:18 2964

原创 kafka高级知识点面试题

kafka是如何提高消息发送的吞吐量的?

2020-06-01 10:34:07 3611

MySQL突击面试宝典

本文主要介绍了索引的结构、失效场景以及执行计划,讨论了建立索引的条件、该在哪些列上建索引,并解决了大表带来的增删改查、添加索引、数据同步等问题。此外,还介绍了ACID特性、脏读、幻读和日志以及主从复制等相关内容。文章提供了SQL语句的优化建议和大表问题解决方法,旨在帮助读者提升数据库查询效率。

2023-08-03

如何写好代码的一些建议(Java版)

本文主要介绍了软件工程中的基础内容,包括命名规范、函数和参数的长度、日志规范、线程安全、圈复杂度、数据结构与算法、异常处理、事务管理和注释设计原则。文章详细解释了命名的含义和规则、日志打印的不同级别和要求、线程池和线程安全的相关概念、数组和链表的特点和使用场景、异常类型和使用误区、事务的传播方式和应用,以及设计原则中的单一职责和开闭原则等。

2023-08-03

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除