1024创新实验室-公告

助力抖音1000个粉丝,开播写代码🎉🎉

打开【抖音APP】-点击【左上角侧边栏】-【点击扫一扫】-【进行关注】🎉🎉


和1024创新实验室一起,热爱代码,热爱生活,永远年轻,永远前行🎉🎉


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


联系我们

1024创新实验室-主任:卓大,混迹于各个技术圈,研究过计算机,熟悉点 java,略懂点前端。
1024创新实验室 致力于成为中原领先、国内一流的技术团队, 以AI+数字化为驱动,用技术为产业互联网提供无限可能, 业务如下:
  • 教育(就业创业大数据平台、继续教育平台、在线教育系统、题库、医学考试、专升本等)
  • 供应链(网络货运、大宗贸易进销存ERP、物流TMS、B2B电商、仓储WMS、AI提效等)
  • 中医大健康(诊所数字化管理、AI辅助诊疗、中医适宜技术、在线问诊、空中药房等)
  • AI+软件(软件定制外包、数据大屏、国产化改造、人员外包、技术顾问、技术培训等)
  • 欢迎各类合作哦,一起赚钱~
加微信: 卓大
拉你入群,一起学习
公众号 :六边形工程师
分享:赚钱、代码、生活
请 “1024创新实验室”
烩面里加肉
咖啡配胡辣汤,提神又饱腹
抖音 : 六边形工程师
直播:赚钱、代码、中医