- 博客(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
原创 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
原创 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
原创 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
MySQL突击面试宝典
2023-08-03
如何写好代码的一些建议(Java版)
2023-08-03
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人