TiCDC Canal-JSON 消息接收示例(Java 版) 本文以一张用户表的数据变更为例,来展示 Java 服务端接收一条 TiCDC Canal-JSON 的消息变更,解析数据,并转发给对应的业务处理程序的流程。
一次多表关联顺序的慢查询——TiDB 关联特性 TiDB 支持了几乎 100% 的 MySQL 语法,但还是会有很多由于实现、分布式等原因导致由一些独有的特性。因此,在使用时,不能经验主义,每个 SQL 还是要老老实实在 TiDB 中执行一次,确认是否符合预期。如果不符合预期,那也不用怕,TiDB 的论坛和文档很丰富,慢慢看,别着急,总有一款适合你的解决方案。
Java 必知必会——分层思维 1. 软件架构软件程序通常由两方面需求组成:功能性需求:程序能为用户做什么,比如,查看订单信息、下单等。非功能性需求:除功能性需求以外的其他必要需求,比如,访问性能、安全性、容错和恢复、本地化、国际化等。非功能性需求所构建起来的正是我们所认知的软件架构。什么是软件架构?简单来说就是软件组成的基本结构,主要为三个要素:代码、代码之间的关系和两者各自的属性。最经典的软件架构就是分层架构,也就是将软件系统分层。2. 什么是代码分层架构?想知道代码分层结构是什么,就要从软件部署分层架构开始。
Java 必知必会——Unix哲学和组合思维 组合思维可以说是来自于Unix的设计哲学:主张组合设计,而不是单体设计;主张使用集体智慧,而不是某个人的特殊智慧。Unix哲学发展至今,诞生了无数优秀的设计原则和最佳事件。其中,对于编程来说,最有价值的原则就是 Peter H. Salus 总结的三条原则:编写可以做一件事并且做的很好的程序。编写程序以协同工作。编写程序来处理文本流,因为这是一个通用接口。这三条规则可以理解为:简单完备性、组合思维和数据驱动。1. 简单完备性这其实就是 “ 简单原则 ”,其宗旨就是:一个程序只做一件事,并且
Java 必知必会——一文讲解 Java四种对象引用:强引用、软引用、弱引用、虚引用 在 “ 什么对象引用 ” 中,我们知道了对象和对象引用的关系,在栈中的对象引用指向堆中的对象。方法调用结束后,栈中的引用会被清空,但存活于堆中的对象,不会随着方法调用的结束而被清除,因此进程空间可能会被不断创建的对象占满。Java 中建立了垃圾回收机制来清除不再被使用的对象。垃圾回收的基本原则是,当存在对象引用指向某个对象时,该对象不会被回收;当没有任何引用指向某个对象时,该对象会回收。但在某些情况下,我们会希望有些对象不需要被立即回收,或者说从全局来看没有被回收的必要。比如缓存系统的设计,为了提高
Java 必知必会——什么是对象引用?按值传递 OR 按引用传递? 1. 什么是对象?任何事物都可以作为一个对象,一台电脑、一部手机等等等等。在面向对象程序设计的 Java 中,程序是由对象组成的,对象包含了描述其状态的数据(属性)和可以执行的操作(方法),因此,每个对象都可以表示具体的事物或者抽象的规则、计划或事件。类是构造对象的模板或蓝图,可以将类比作制造手机的流水线,而对象就是一台台手机。由类构造对象的过程被称为创建类的实例,因此,也可以把对象称作实例。2. 什么是对象引用?每种语言都有自己的数据处理方式,因此,必须注意将要处理的数据是什么类型。直接操
Java 必知必会——一文详解对象包装器和自动装箱与拆箱 1. 对象包装器某些情况下,基本类型如 int 需要转换为对象。因此,在 Java 中,所有的基本类型都有一个与之对应的类,通常,这些类被称为包装器。对象包装器类是不可变的,也就是说,一旦构造了包装器,就不允许改变包装在其中的值。同时包装器类还是 final ,因此,不能定义包装器类的字类。注意:由于包装器类引用可以为 null, 因此自动装箱可能会抛出 NullPointException 异常:Integer n = null;System.out.println(2 * n); //
Java 必知必会——自动转型与强制类型转换 1. 自动转型基本类型之间经常会需要进行数值类型转换,数值范围较小的数据类型可以自动转换为数值范围大的基本类型。如图所示:6个实心箭头:表示两个数值类型无信息丢失的转换。3个虚线箭头:表示两个数值类型的转换可能会存在精度损失。也就是说,147258369 是一个大整数,其包含的位数比 float 类型所能表达的位数多。将这个整型数值转换为 float 是,会丢失精度。int i = 147258369;float f = i; // f = 1.47258368E8因此,将两个不同
Java 必知必会——基本数据类型 Java 是一种强类型语言,也就是说必须为每一个变量声明一种类型。在 Java 中,一共有 8 种基本类型,其中有 4 种整形、2 种浮点类型、1种表示 Unicode 编码的字符单元类型 char 和 1 种表示真值的 boolean 类型。1. 整型整型用于表示没有小数部分的数值,允许负数的出现。取值范围类型存储需求取值范围int4 字节-21 4748 3648 ~ 21 4749 3647 (超过20亿)short2 字节-3 2768 ~ 32767
初学 Java 设计模式(二十三):实战访问者模式 「今天,你的基金红了吗?」 一、访问者模式介绍1. 解决的问题主要解决稳定的数据结构和易变的操作耦合问题。2. 定义访问者模式是一种行为设计模式,它能将算法与其所作用的对象隔离开来。3. 应用场景如果需要对一个复杂对象结构(例如对象树)中的所有元素执行某些操作,可使用访问者模式。可使用访问者模式来清理辅助行为的业务逻辑。当某个行为仅在类层次结构中的一些类中有意义,而在其他类中没有意义时,可使用访问者模式。二、访问者模式优缺点1. 优点开闭原则:可以引入在不同类对象上执行的新行为,且无需对这些类做出修改。单
初学 Java 设计模式(二十二):实战模板方法模式 「开发必备利器 uTools」 一、模板方法模式介绍1. 解决的问题主要解决在多个子类中重复写某个通用方法的问题。2. 定义模板方法模式是一种行为设计模式,它在超类中定义了一个算法的框架,允许子类在不修改结构的情况下重写算法的特定步骤。3. 应用场景当只希望客户端扩展某个特定算法步骤,而不是整个算法或其结构时,可使用模板方法模式。当多个类的算法除一些细微不同之外几乎完全一样时,可使用模板方法模式。但后果是:只要算法发生变化,可能要修改所有的类。二、模板方法模式优缺点1. 优点可以仅允许客户端重写一个大型算法中的特
初学 Java 设计模式(二十一):实战策略模式 「SpringBoot 优雅实现策略模式」 一、策略模式介绍1. 解决的问题主要解决多种算法类似的情况下,使用条件语句所带来的复杂和难以维护。2. 定义策略模式是一种行为设计模式,它能让你定义一系列算法,并将每种算法分别放入独立的类中,以使算法的对象能够相互替换。3. 应用场景当想使用对象中各种不同的算法变体,并希望能在运行时切换算法时,可使用策略模式。当有许多仅在执行某些行为时略有不同的相似类时,可使用策略模式。如果算法在上下文的逻辑中不是特别重要,使用策略模式能将类的业务逻辑与其算法实现细节隔离开来。当类中使用了复杂条件运算符
初学 Java 设计模式(二十):实战状态模式 「亲身实践,简单高效的时间管理——番茄工作法」 一、状态模式介绍1. 解决的问题主要解决在对象一个内部状态发生变化时,改变其行为的问题。2. 定义状态模式是一种行为设计模式,让你能在一个对象的内部状态变化时改变其行为,使其看上去就像改变了自身所属的类一样。3. 应用场景如果对象需要根据自身当前状态进行不同行为,同时状态的数量非常多且与状态相关的代码会频繁变更的话,可使用状态模式。如果某个类需要根据成员变量的当前值改变自身行为,从而需要使用大量的条件语句时,可使用状态模式。当相似状态和基于条件的状态机转换中存在许多重复代码时,可使用状态模
初学 Java 设计模式(十九):实战观察者模式 「您的快递已到达蜂站,请及时签收」 一、观察者模式介绍1. 解决的问题主要解决将一个对象的状态改变通知给其他对象的问题。2. 定义观察者模式是一种行为设计模式,允许你定义一种订阅机制,可在对象事件发生时通知多个 “观察” 该对象的其他对象。3. 应用场景当一个对象的改变需要改变其他对象,或实际对象时是事先未知的或动态变化时,可使用观察者模式。当应用中的一些对象必须观察其他对象时,可使用观察者模式,但仅能在有限时间内或特定情况下使用。二、观察者模式优缺点1. 优点开闭原则:无需修改发布者代码就能引入新的订阅者(如果是发
初学 Java 设计模式(十八):实战备忘录模式 「线上刚发布就出问题怎么办?」 一、备忘录模式介绍1. 解决的问题主要解决在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,从而可以恢复原先保存的状态。2. 定义备忘录模式是一种行为设计模式,允许在不暴露对象实现细节的状态下保存和恢复对象之前的状态。3. 应用场景当你需要创建对象状态快照来恢复其之前的状态时,可以使用备忘录模式。当直接访问对象的成员变量、获取器或设置器将导致封装被突破时,可以使用备忘录模式。二、备忘录模式优缺点1. 优点可以在不破坏对象封装情况的前提下创建对象状态快照。
初学 Java 设计模式(十七):实战中介者模式 「菜鸟驿站」 一、中介者模式介绍1. 解决的问题主要解决当对象与对象之间存在大量关联关系时,若一个对象发生改变,要跟踪与之相关的对象,同时做出相应处理的问题。2. 定义中介者模式是一种行为设计模式,能减少对象之间混乱无序的依赖关系。该模式会限制对象之间的直接交互,迫使它们通过一个中介者对象进行合作。3. 应用场景当一些对象与其他对象紧密耦合以至于难以对其进行修改时,可使用中介者模式。当组件因过于依赖其他组件而无法在不同应用中复用时,可使用中介者模式。为了在不同情景下复用一些基本行为,导致需要被迫创建大量
初学 Java 设计模式(十六):实战迭代器模式 「你有多少 QQ 好友呢?」 一、迭代器模式介绍1. 解决的问题主要解决遍历整个集合对象的问题。2. 定义迭代器模式是一种行为设计模式,能在不暴露底层表现形式(列表、栈和树等)的情况下遍历集合中所有的元素。3. 应用场景当集合背后为复杂的数据结构,且希望对客户端隐藏其复杂性时(处于使用便利性或安全性考虑),可以使用迭代器模式。减少程序中重复的遍历代码,可以使用迭代器模式。希望代码能够遍历不同的甚至无法预知的数据结构,可以使用迭代器模式。二、迭代器模式优缺点1. 优点单一职责原则:通过将体积庞大的遍历算法代码抽
初学 Java 设计模式(十五):实战命令模式 「扫码点餐」 一、命令模式介绍1. 解决的问题主要解决在系统中,行为请求者和行为实现者紧耦合的问题。2. 定义命令模式是一种行为设计模式,它可将请求转换为一个包含与请求相关的所有信息的独立对象。这个转换会根据不同的请求将方法参数化、延迟请求执行或将其放入队列中,且能实现可撤销操作。3. 应用场景需要通过操作来参数化对象,可使用命令模式。将操作放入队列中、延迟操作的执行或者远程执行操作,可使用命令模式。实现操作回滚功能,可使用命令模式。二、命令模式优缺点1. 优点单一职责原则:可以解耦触发和执行
初学 Java 设计模式(十四):实战责任链模式 「请求中间件」 一、责任链模式介绍1. 解决的问题主要解决请求发送者和处理者的解耦问题。2. 定义责任链模式是一种行为设计模式,允许将请求沿着处理者链进行发送。收到请求后,每个处理者均可对请求进行处理,或将其传递给链上的下个处理者。3. 应用场景当程序需要不同方式处理不同种类请求,而且请求类型和顺序预先未知时,可以使用责任链模式。当必须按照顺序执行多个处理者时,可以使用责任链模式。如果所需处理者及其顺序必须在运行时进行改变,可以使用责任链模式。二、责任链模式优缺点1. 优点可以控制请求处理的顺序
初学 Java 设计模式(十三):实战代理模式 「视频 App 代理缓存」 一、代理模式介绍1. 解决的问题主要解决直接访问对象时带来的问题,比如对象创建开销过大或安全控制等。2. 定义代理模式是一种结构型设计模式,能够提供对象的替代品或其占位符。代理控制着对于原对象的访问,并允许在将请求提交给对象前后进行一些处理。3. 应用场景延迟初始化(虚拟代理):如果有一个偶尔使用的重量级服务对象,一直保持该对象运行会消耗系统资源时,可使用代理模式。访问控制(保护代理):如果只希望特定客户端使用服务对象(该对象可能非常重要),而客户端则是各种已启动的程序(包括恶意程序),可