Skip to content

Conversation

@mikawudi
Copy link

需求: 多租户平台,业务中针对部分业务表的分表需要根据sql中的orgid字段的值进行表替换

实现:
在DynamicTableNameInnerInterceptor中
使用TableNameHandlerFactory替换直接使用TableNameHandler
TableNameHandlerFactory创建TableNameHandler的时候可以捕获MPBoundSql中的parameterObject
,也可以在TableNameHandlerFactory的实现中使用单例TableNameHandler实现和现在一样的静态TableNameHandler效果
所以将DynamicTableNameInnerInterceptor中的tableNameHandler标注为Deprecated,但是依旧保留并且在执行阶段做了兼容

…定TableNameHandler的方案,TableNameHandlerFactory创建的TableNameHandler可以捕捉BoundSql中的query的参数作为上下文,使参数化查询的sql中的value可以作为动态分表的判断条件
@miemieYaho
Copy link
Contributor

你为什么不去用shardingjdbc

@mikawudi
Copy link
Author

你为什么不去用shardingjdbc

我也想把这事丢给sharding处理的..但是基线要求springboot升级到3.x然后国产化需求对接的是达梦,这一套下来sharding不兼容达梦,改不动,和达梦提了问题,不知道啥时候能做兼容......只好在这里自己动手改了.......可怜可怜被组件折磨的孩子,收留这个pr吧

@miemieYaho
Copy link
Contributor

sharding5和spring版本又没关系,你有试过让sharding把达梦识别为mysql吗?

@mikawudi
Copy link
Author

sharding5和spring版本又没关系,你有试过让sharding把达梦识别为mysql吗?

abbb acccc

spring boot3.x要求升级sharding到5.3然后5.3的supported_storage_types没有达梦,你是指直接类型弄成Mysql去测试兼容达梦?,两个sql方言差距挺大的,sqlparser应该不兼容,出问题更麻烦

@miemieYaho
Copy link
Contributor

达梦不是抄的mysql吗?那是抄的pg?

@mikawudi
Copy link
Author

对不起....他抄的oracle的....

@miemieYaho
Copy link
Contributor

miemieYaho commented Aug 20, 2025

他也支持Oracle啊,你试过吗?sharding5.5也不需要spring-starter啊,按他文档给的java api自己构建他的datasource那一套注入到spring里,根本不需要在什么配置文件里写规则
https://shardingsphere.apache.org/document/current/cn/user-manual/shardingsphere-jdbc/java-api/rules/sharding/

@mikawudi
Copy link
Author

恩,我试一试吧,原先的集成后,对接后端数据源是根据jdbc连接字符串的协议自动生成的,遇到不支持我就放弃了,我注入强制切换试一下吧

@miemieYaho
Copy link
Contributor

org.apache.shardingsphere.infra.database.DatabaseTypeEngine

@mikawudi
Copy link
Author

很难,通过sharding的spi机制注入了DmFakeDataType implements DatabaseType的伪装类型和DMParseFacade implements SQLDialectParserFacade, 内部都使用sharding的Oracle解析器来兼容实现,并且getType也返回了Oracle,然后DmFakeDataType也注入支持列表通过验证,连接池初始化正常,但是metadata中logic_db根据分表规则创建的逻辑表没初始化出来,执行sql查询逻辑表抛异常,相同的分表规则mysql数据源下是正常的......估计这玩意的兼容不是简单改下就能用的.....也没啥时间去在sharding上给达梦做适配.......

  1. 相同规则下达梦的logic_db的分表元数据
aaa 2) 相同规则下Mysql的咯个ic_db的分表元数据 bbb

@mikawudi
Copy link
Author

emm,没事了.....好像达梦要全大写的逻辑表名....分表规则逻辑表名用全大写可以了.....具体我再试试

@mikawudi
Copy link
Author

org.apache.shardingsphere.infra.database.DatabaseTypeEngine

emm,已经使用sharding处理掉了,你看下这个pr有合并的价值么,没有的话直接关掉就好(个人觉得还是合理的扩展的撒有兴趣可以review一下)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants