shardingSphere jdbc 5.3.0 读写分离怎样实现跨库查询?

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

使用环境:

spring boot 2.3.12
mysql 5.7
mybatis Plus 3.5
spring boot 2.3.12
shardingSphere jdbc 5.3.0

场景、问题:

配置主从数据源后

然后在同一个mysql实例下的跨sql库查询会报错,如图,从报错信息看,执行sql里的库名(organizational_structure_private_yjy_yns)没问题,就是不懂怎么报错?求大神指教下怎么解决

已进行操作:

读写分离Yaml配置

现状:

如果sql中存在有跨库表执行会报错,看看怎样通过配置或者相关SPI实现这种需求场景?

在 ShardingSphere 中,db.table 中的 db 被解析为逻辑库,无法按照图中这种方式操作。
可以再配置一个指向 organizational_structure_private_yjy_yns 的 dataSource,该 dataSource 中存在 role 表即可。
那么在查询时不需要指定 db,ShardingSphere 能够自动路由。
SQL 就改为: SELECT xxx FROM role.

那具体要怎样可以再配置一个指向 organizational_structure_private_yjy_yns 的 dataSource呢,谢谢

再添加一个 data source,没有特别要求

我试了加上这个数据源后,还是会报这个错,或者看看还有其他解决方案吗?

SQL 中只需要 SELECT xxx FROM role 就可以了,不指定你的物理库名称。

SS 知道每张表在哪个库上(当然前提是没有重名的表),如果有,情况会变得复杂。

是的,因为项目数据源是在同一mysql下多个库,所以存在相同表,所以看看这种情况下怎么解决比较好?

对于存在同名单表的情况,可以通过配置 sharding rule 的方式来解决。

rules:
- !SHARDING
  tables:
    table_a:
      actualDataNodes: ds_xx1.table_a
    table_b:
      actualDataNodes: ds_xx2.table_a

这种方式相当于给物理表取了一个别名,DML SQL 都要改写为 table_b 去访问 ds_xx2.table_a。

虽然这样可以用,但对 SQL 有影响,因此还是尽量不要出现这种情况。
我们的物理库中可以通过每个库使用统一表前缀的方式来分区吗?

例如 db1 中 opt_user, db2 中 erp_user,这样当数据源聚合到 SS 后,也不会出现同名单表冲突的问题。

由于是在原有项目集成的,因此会存在大量不同库但同名的表,但又不太想用分片模式(因为有sql语法兼容问题)。所以基于这种特殊情况,是否可以改写源码路由或者扩展SPI达到效果呢?

同名不分片的情况,路由做不到,因为元数据里只有一份。

还有一种办法是尝试下 hint 方式,查询同名表的时候指定 ds,可以自己控制查询哪个数据源。
这种方式同样对 SQL 有要求,要写注释
https://shardingsphere.apache.org/document/current/cn/user-manual/common-config/sql-hint/

我通过源码调试跟踪,把AbstractSQLBuilder类里的toSQL重写方法直接返回逻辑sql就可以解决上面场景需求,但这样需要改源码重新打包了,想问下,如果补改源码情况下,有什么配置或SPI可以重写这里,实现直接返回原始sql执行吗?

目前 SQLBuilder 都是直接 new 的方式使用的,暂时无法通过 SPI 扩展。

您好,我也遇到题主的问题,我按照您说的方法修改了,

原始sql
select a.id b.market_name from A.wx_member_market_middle as a left join B.market as b on a.market_id = b.id WHERE a.member_id=?

A库和B库 跨库查询
我按您说的去掉具体库名,修改sql如下

select a.id b.market_name from wx_member_market_middle as a left join market as b on a.market_id = b.id WHERE a.member_id=?

但错误提示为:All tables must be in the same datasource.

请问是必须要 shardingsphere jdbc 5.3.0 才支持么??

使用的是 shardingsphere-jdbc-core-spring-boot-starter version5.1.1

请问你这个问题解决了吗?解决办法是啥,谢谢

shardingsphere-jdbc-core 5.3.2 无法跨库查询,按您说的方法修改,提示All tables must be in the same datasource.

你的 SQL 是跨库 JOIN,和楼主原来的问题不同。 跨库 JOIN 可以开启联邦查询功能来满足,请参考 props 配置,指定一个联邦查询引擎。
https://shardingsphere.apache.org/document/current/cn/user-manual/common-config/props/

注:联邦查询目前是实验性功能。

京ICP备2021015875号