一.强制分片路由
在一些应用场景中,分片条件并不存在于SQL,而存在于外部业务逻辑。
因此需要提供一种通过外部指定分片结果的方式,在Sharding-JDBC中叫做Hint。
比如:根据包裹id查询所有跟包裹相关的所有数据。此时根据包裹id这个业务逻辑来指定分片。
二.实现机制:
Sharding-JDBC使用ThreadLocal管理分片键值。可以通过编程的方式向HintManager中添加分片条件,该分片条件仅在当前线程内生效。
除了通过编程的方式使用强制分片路由,Sharding-JDBC还计划通过SQL中的特殊注释的方式引用Hint,使开发者可以采用更加透明的方式使用该功能。
指定了强制分片路由的SQL将会无视原有的分片逻辑,直接路由至指定的真实数据节点。
三.强制分片路由-实战案例:
在一个搜索操作中,需要查询多张表数据。
比如查询5张表,包裹,包裹详情,拣货单,叫号,发货单等等
因为分片值=tententId / 3 ,我们可以通过目标参数得到分片值和参数集合,再循环所有的分片值和参数,去目标库中一步步获取我们需要的所有信息。



@Test
public void testPageForForceRoute() {
HintManager hintManager = HintManager.getInstance();
hintManager.addDatabaseShardingValue("order_info","uid", 0);
Pageable pageable = PageRequest.of(1,2,Sort.by("oid"));
Page<OrderInfo> page = orderInfoRepository.findAll(pageable);
List<OrderInfo> list = page.getContent();
for(OrderInfo info:list) {
System.out.println("id="+info.getOid()+",status="+info.getStatus());
}
hintManager.close();
}
四.强制路由到主库
//读写分离,强制路由到主库.
HintManager hintManager = HintManager.getInstance();
hintManager.setMasterRouteOnly();
网友评论