本文手把手教你,使用 ORM 面向对象的方式,进行 Mongodb Sharding 分片查询。
1、在 bee.properties 里添加配置。
bee.db.dbName=MongoDB
bee.dosql.multiDS.enable=true
bee.dosql.multiDS.differentDbType=false
bee.dosql.multiDS.sharding=true
bee.dosql.multiDS.defalutDS=ds0
2、分片配置:
以下为对 Orders 实体分片的配置,简单易用。
表示有两个分片 ds0,ds1; 基本表名是:orders, ds0 中有 orders0,orders1,orders2; ds1 中有 orders3,orders4,orders5;
Bee 会解析得到 orders 所有表的分布情况。fullNodes: {orders={ds0=[0, 1, 2], ds1=[3, 4, 5]}}
public class ShardingDoConfig {
public static void init() {
ShardingConfig.addShardingBean(Orders.class,new ShardingBean("ds[0..1].orders[0..5]", "userid"));
}
}
3、分片数据源设置
package org.teasoft.exam.bee.mongodb.sharding;
import java.util.LinkedHashMap;
import java.util.Map;
import javax.sql.DataSource;
import org.teasoft.beex.mongodb.ds.MongodbSimpleDataSource;
import org.teasoft.honey.osql.core.BeeFactory;
public class InitDsAndMongoDsUtil {
public static void initDS() {
try {
MongodbSimpleDataSource dataSource0=new MongodbSimpleDataSource("mongodb://localhost:27017/ds0","","");//没有设置用户名和密码,仅用于测试
MongodbSimpleDataSource dataSource1=new MongodbSimpleDataSource("mongodb://localhost:28018/ds1","","");
Map<String, DataSource> dataSourceMap = new LinkedHashMap<>();
dataSourceMap.put("ds0", dataSource0);
dataSourceMap.put("ds1", dataSource1);
BeeFactory.getInstance().setDataSourceMap(dataSourceMap);
} catch (Exception e) {
e.printStackTrace();
}
}
}
4、查询(分页查询)
userid 为分片键,需要设置。在 main 方法,调用以下方法即可。
public static void test() {
Suid suid=BF.getSuid();
Orders orders1=new Orders();
Condition condition=BF.getCondition();
condition
.lParentheses()
.op(Orders_F.userid, Op.eq, 1) //userid为分片键
.or()
.op(Orders_F.userid, Op.eq, 3)
.or()
.op(Orders_F.userid, Op.eq, 2)
.rParentheses()
;
condition
.start(0) //从首页开始
.size(2);
//条件全在condition
List<Orders> list=suid.select(orders1,condition);
Printer.printList(list);
}
5、生成的日志
说明:根据条件,会查询到三条数据(分别在三个不同的分片),然后一页只返回 2 条记录。