MyBatis 源码 - Plugin 插件实现过程
MyBatis 的执行过程中主要涉及四个很重要的接口,分别是 Executor、ParameterHandler、ResultSetHandler 和 StatementHandler,为了方便用户在上述接口执行过程中植入增强逻辑,MyBatis 实现了插件支持,即用户可以定义对上述接口的方法拦截逻辑,MyBatis 将通过动态代理将这里逻辑植入到具体接口方法的执行过程中。
……MyBatis 的执行过程中主要涉及四个很重要的接口,分别是 Executor、ParameterHandler、ResultSetHandler 和 StatementHandler,为了方便用户在上述接口执行过程中植入增强逻辑,MyBatis 实现了插件支持,即用户可以定义对上述接口的方法拦截逻辑,MyBatis 将通过动态代理将这里逻辑植入到具体接口方法的执行过程中。
……在使用 Mabatis 时往往需要有成对出现的 .java
后缀格式 Mapper 接口文件及 .xml
后缀格式的 XML 文件,其中 XML 文件放在资源目录,而 Java 文件自然放在运行目录,通过调用 Mapper 接口中定义的方法就能触发到其通过 namespace 关联的 XML 文件中的 SQL 语句,从而实现了业务逻辑与数据库交互的解耦,避免像传统 JDBC 编程那样在 Java 代码中写 SQL 与数据库交互,那么 Mybtis 是怎么将 Mapper 接口方法与 XML 中 SQL 语句进行绑定与触发的呢?下面我们通过测试方法 debug 调试进行进行代码跟踪。
ThreadPoolExecutor 是 Java 的线程池实现,其中封装了对线程的管理(包括创建、调度、销毁等)及任务的分配等逻辑,作为核心并发组件,其中使用到了如阻塞队列、ReentrantLock、原子变量等并发包下的基础工具,由于前面看完了 ReentrantLock 等相关的源码,所以尝试窥探下 ThreadPoolExecutor 的工作过程。
……由于 JDK 1.7 的 ConcurrentHashMap 的实现使用到了 ReentrantLock,刚好前面也已经看过了 ReentrantLock 的实现,所以顺势看下 1.7 版本的 ConcurrentHashMap 是如何实现的。
……前面已经了解了 AbstractQueuedSynchronizer 和 ReentrantLock 的原理,接下来看看共享锁组件 CountDownLatch 是如何基于 AbstractQueuedSynchronizer 实现,在我看来,如果能先了解 AbstractQueuedSynchronizer 的运作过程,那么再看 CountDownLatch 会觉得比较容易理解。
……前面已经或粗或细地看过了 AbstractQueuedSynchronizer 的源码,不妨趁热打铁把其常见的实现的源码也翻一遍,于是我们先来看 ReentrantLock
内部是怎么实现的。
前段时间线上遇到 OOM
问题,定位到的原因是线程池创建线程的个数过多,导致内存不够用;为此好奇去看了眼线程池的源码,发现线程池会在调度任务执行时才会创建实际的线程对象,但是再往下看时遇到了不懂的东西,比如 AbstractQueuedSynchronizer
,没办法只好先把基础的组件搞明白。
很久之前我写了这么一个并发异步的工具方法,传入的 suppliers
是具体的业务方法函数引用,考虑这个一个业务场景,我们需要去数据库统计某个表最近一个月在某个条件下的数量,那么为了提高响应效率,可以通过按天切分日期,然后组装成相应的 supplier
,再通过多线程异步处理,最后统一收集完结果返回。
最近在实际项目中遇到一个需求,背景是系统中有几张表使用了 longtext
类型的字段 extend_info
储存用户的一些比如电话号码、下单地址等敏感信息,出于对信息安全的考虑,该需求需要新增一个 extend_info_cipher
字段并进行加解密操作,不过由于涉及的数据量较大,目前大致可分为四个阶段进行增量覆盖,每个增量递进通过参数配置触发: