Skip to content

SmartDb 读写分离、多数据源等看似高端的技术使用和原理分析

SmartDb 支持多数据源、多数据库、读写分离是如何使用的以及如何做到的,那么这次带你去看下原理。

1、前提

通过前几篇的文章,相信你已经会使用了SmartDb的操作,但是此刻需要再次强调一个东西: 一个SmartDb对象代表着一个数据库集群( 包含 1个主库,n 个从库 , n 可以为0 )

具体可以看下SmartDb实现类源码SmartDbImpl

java
class SmartDbImpl implements SmartDb {
    /**
     * 随机获取slave库的索引
     */
    private AtomicInteger roundIndex = new AtomicInteger(-1);
    /**
     * 主库 ( 写 库 )
     */
    private SmartDbNode master;
    /**
     * 从库 ( 读 库 )
     */
    private List<SmartDbNode> slaves;
    /**
     * smartdb 配置信息
     */
    private SmartDbConfig smartDbConfig;
    /**
     * 是否存在 从库( 读 库 )
     */
    private boolean existSlave;

SmartDbNode表示一个集群中的一个数据库节点(节点表示一个数据库实例),可以看到 SmartDb对象中有 一个master和一个List的 slaves,此刻你应该能理解了

2、读写分离

默认所有的 查询 操作,都是在 slaves 节点中执行的,系统会使用 上面代码中的 roundIndex 按照顺序拿到从库的一个数据库Node节点进行 sql 查询操作的。代码如下

java
public SmartDbNode getSmartDbNode4Query() {
    if (this.existSlave) {//如果存在 从库(读库)
        int round = this.roundIndex.incrementAndGet();
        return this.slaves.get(Math.abs(round % this.slaves.size())); 
    } else { // 不存在读库,则使用 主库(写库)
        return this.master;
    }
}

demos:

java
smartDb.queryList(User.class, "select * from user" ); // 从库(读库)读取
smartDb.execute("delete from user where id = 1"); // 写库(主库)执行:增加、删除、修改、批量、事务等

如果想在 从库(读库)进行 查询数据如何操作呢?

java
smartDb.getMaster() // 先获取 主库(写库)
   .queryList(User.class, "select * from user" ); // 在 写库(主库)上读取

有没有很简单呢?

3、更多Demo

请看项目: https://gitee.com/lab1024/smartdb-demos