六边形工程师
主页
文章
开源
关于我
1024创新实验室
微信号:卓大 (六边形工程师)
毕业于:山东大学 计算机
地点:洛阳/郑州/上海
职位:六边形数字科技-CEO
近期:专注AI+中医/供应链/教育
技能:CTO / 产品经理 / 全栈工程师
领域:教育,供应链,中医大健康;
公众号:六边形工程师
名称:六边形工程师
分享:赚钱、代码、生活
分享:AI发展、AI变现
分享:互联网 运营/产品/技术
关注 :中医健康问题
五、SmartDb 读写分离、多数据源等看似高端的技术使用和原理分析
|
分类于
SmartDb
SmartDb
前言:
SmartDb 支持多数据源、多数据库、读写分离是如何使用的以及如何做到的,那么这次带你去看下原理(预计阅读1分钟)
#### 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
slaves; /** * smartdb 配置信息 */ private SmartDbConfig smartDbConfig; /** * 是否存在 从库( 读 库 ) */ private boolean existSlave; ``` `SmartDbNode`表示一个集群中的一个数据库节点(节点表示一个数据库实例),可以看到 SmartDb对象中有 一个master和一个List的 slaves,此刻你应该能理解了 #### 2、读写分离 默认所有的 查询 操作,都是在 slaves 节点中执行的,系统会使用 上面代码中的 `roundIndex` 按照顺序拿到从库的一个数据库Node节点进行 sql 查询操作的。代码如下 ``` 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: ``` smartDb.queryList(User.class, "select * from user" ); // 从库(读库)读取 smartDb.execute("delete from user where id = 1"); // 写库(主库)执行:增加、删除、修改、批量、事务等 ``` ##### 如果想在 从库(读库)进行 查询数据如何操作呢? ``` smartDb.getMaster() // 先获取 主库(写库) .queryList(User.class, "select * from user" ); // 在 写库(主库)上读取 ``` 有没有很简单呢? #### 3、更多Demo 请看项目: [https://gitee.com/lab1024/smartdb-demos](https://gitee.com/lab1024/smartdb-demos "https://gitee.com/lab1024/smartdb-demos")
阅读 (4400)
喜欢 (
0
)
评论 (0)
走起吐槽