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" ); // 在 写库(主库)上读取
有没有很简单呢?