多数据源、多个库操作报错问题

方便更快捷的说明问题,可以按需填写(可删除)

使用环境:

springboot、shardingsphere-jdbc 5.0.0、mybatis

场景、问题:

配置:


其中第二个数据源ds1中存在两个库:
winnerdata和winnerdata_model
此时sql关联查询这两个库里的内容
select * from a left join winnerdata_model.b
报出异常:

后来我将winnerdata_model库中的b表迁移到了winnerdata中,这样两个库都中都有相同的表。
image
这时的异常:

现状:

这种业务场景应该怎么办?

最终使用的 SQL 是怎样的? 图片不完整,请贴出字符串

没迁移之前:(除了mall_kl_benchmark_year在winnerdata_model中,其他表都在winnerdata库中)

SELECT sm.siteId,d.CalendarYear DATETIME,SUM(mk.innum_benchmark) kl
FROM site_mapping sm
LEFT JOIN dimdate d
ON d.CalendarYear = ?
LEFT JOIN winnerdata_model.mall_kl_benchmark_year mk
ON mk.year = d.CalendarYear
AND mk.datadate = d.FullDateAlternateKey
AND mk.mall_id = sm.siteId
WHERE sm.clientid = ?
GROUP BY d.CalendarYear
ORDER BY d.DateKey;

后来迁移了,将winnerdata_model表同步到winnerdata中,将sql中的winnerdata_model去掉了

所以最终执行的 SQL 是这样的:

SELECT sm.siteId,d.CalendarYear DATETIME, SUM(mk.innum_benchmark) kl
FROM site_mapping sm
LEFT JOIN dimdate d
ON d.CalendarYear = ?
LEFT JOIN mall_kl_benchmark_year mk
ON mk.year = d.CalendarYear
AND mk.datadate = d.FullDateAlternateKey
AND mk.mall_id = sm.siteId
WHERE sm.clientid = ?
GROUP BY d.CalendarYear
ORDER BY d.DateKey;

并且这些表都在 ds1 中,对吗? 那么 ds0 库中有什么表呢?你的分表规则指定的是 ds0

这些表都在ds1,ds1没有用到分表规则出现的问题。
ds0的库在这里没有用到。

那我建议你检查一下 ds0,是否有表与以上用到的表同名,这可能导致该问题。

和ds1,两个库中有相同的表名没有关系么?

ds1 指定了是使用 winnerdata 这个库,不会受同实例的其他库影响。

1.如果跨库查询,ds0和ds1关联查询,我们应该怎么做?
2.ds0和ds1有表同名不是应该ss会默认选一个表么?

  1. 阅读 【跨库关联查询】
  2. 是选一个库,但这个库上没有你要关联的表,这不是出问题了吗? 因此要保证自己的业务正确,不要把这些都交给随机的逻辑。
    建议:各种配置一定要通过文档理解之后再使用

2.目前的业务需求多库有部分表都是重复的,修改起来工作量也比较大,请问还有其他更好的办法解决么?

从你的分片配置看,当前业务只需要 ds0,ds1 是给其他业务使用的吗? 是否可以不把 ds0 添加进来?

如果多个 resource 有同名表,又没有给定配置,关联查询的场景无法处理,那就需要从库表结构开始重构。

1.ds0,ds1有同名的表,能否用广播表的形式进行配置?
2.如果用广播表可以能不能将广播表再进行分片?

1、如果数据需要保持一致,如字典表,可以配置为广播表。
2、广播表会存在于每个分库,不能对广播表进行分表操作。

京ICP备2021015875号