mysql 在一个sql文件中引用另外一个sql文件中自定义函数_社区投稿 | DBLE 自定义拆分算法...

原创: 钟悦

作者简介钟悦,就职于某大型国有银行,多年从事MySQL和分布式中间件的方案设计与实施工作;资深MySQL数据库专家,架构师;DBLE开源项目积极贡献者。

本文目录

1. 工作原理

  • 1.1 函数的加载
  • 1.2 路由计算
  • 1.3 参数查询

2. 开发和部署

  • 2.1 开发
  • 2.2 部署

3. 接口规范

  • 3.1 配置项setters
  • 3.2 selfCheck()
  • 3.3 init()
  • 3.4 calculate()和calculateRange()
  • 3.5 getAllProperties()

4. 内置路由函数的缩写与类名对照表

| 文章概要 |

DBLE默认支持数十种数据拆分算法,基本能满足大部分的社区用户的使用需求;为了满足更广的业务场景,DBLE还支持更加灵活的自定义拆分算法;本文对面向有类似需求的DBLE开发者,提供了一个如何开发和部署自定义的拆分规则的一个指引

1. 工作原理

1.1 函数的加载

路由函数的加载发生在DBLE启动或重载时。

5d6ebbed38e3c9558947c9517a70d806.png
  • DBLE读取rule.xml时,根据用户配置的标签的class属性
  • DBLE通过Java的反射机制,从$DBLE_HOME/lib的jar包中,找到对应的jar(里的class文件),加载同名的类并创建对象
  • DBLE会逐个扫描中的标签,并根据name属性来调用路由函数的对应setter,以此完成赋值过程——例如,如果用户配置了2,那么DBLE就会尝试找路由函数中叫做setPartitionCount()的方法,并将字符串“2”传给它
  • DBLE调用路由函数的selfCheck()方法,执行函数编写者制定的检查动作,例如检查赋值得到的变量值是否有问题
  • DBLE调用路由函数的init()方法,执行函数编写者制定的准备动作,例如创建后面要用到的一些中间变量

1.2 路由计算

路由函数接受用户SQL中的分片字段的值,计算出这个值对应的数据记录应该在哪个编号的数据分片(逻辑分片)上,DBLE从而知道把这个SQL准确发到这些分片上。

9f0c436071e8768277f667b7b9bb8a4c.png

1.3 参数查询

用户通过管理端口(默认9066),通过SHOW @@ALGORITHM WHERE SCHEMA=? AND TABLE=?来查询表上的路由算法时,DBLE调用路由算法的getAllProperties()方法,直接从内存中获取路由信息的配置。

4f891d1311d25c84f42489abd55b27b0.png

2. 开发和部署

2.1 开发

开发时,理论上只需要引入AbstractPartitionAlgorithm抽象类和RuleAlgorithm接口及它们的依赖类就可以了。但实际上AbstractPartitionAlgorithm抽象类依赖了TableConfig类,由此开启了环游世界的依赖之旅。因此,现实的操作还是引用整个DBLE项目的源代码会比较直接方便。

开发一个新的路由函数时,必须给这个路由函数的开发新建项目,然后再引用DBLE项目(项目引用项目的方式)。而不应该直接打开DBLE的项目,然后在DBLE的项目里面直接新建源代码来直接开发(内嵌开发方式)。通过遵循这个做法,会有以下好处:

  1. 路由函数可以独立打包,直接去看路由函数的jar包版本就能够确认函数版本;而把路由函数嵌到DBLE里的话,就很容易出现DBLE版本一样,但不清楚里面的函数是什么版本的窘况
  2. 路由函数的递进可以更加自由,如果DBLE的AbstractPartitionAlgorithm抽象类和RuleAlgorithm接口没有变动,同一版本的路由函数可以延续使用好几个版本的DBLE,而不需要每次DBLE释放新版就得去重编译
  3. 可以让路由函数中的受保护代码免受DBLE自身的开源协议影响

2.2 部署

完成开发之后,成品打包成jar包进行发布,而不要直接发布class和依赖的library(其他项目的jar包或class文件)。

让DBLE使用上新的路由函数的过程:

  1. 将成品jar包放入$DBLE_HOME/lib目录中
  2. 调整jar包的所有者权限(chown)和文件权限(chmod),使之与其他$DBLE_HOME/lib目录里的jar包一样
  3. | 请注意:2.18.12.0及以后版本建议放在algorithm目录下,用于区分原生lib和自定义lib,便于管理
  4. 按照原来的思路配置rule.xml,但需要注意标签的class属性必须要填写新的路由函数类的完全限定名(Fully Qualified Name),例如net.john.DBLE.route.functions.NewFunction
  5. 配置逻辑表之类的必要信息,重启DBLE后,自动生效。

3. 接口规范

每个路由函数本质上就是一个继承了AbstractPartitionAlgorithm抽象类,并且实现了RuleAlgorithm接口的一个类。下面以内置的com.actiontech.DBLE.route.function.PartitionByLong为例,介绍实现一个路由函数类所需要做的最小工作(必要工作)。

00b1873493952d0853dc4eeb232eb9f6.png

3.1 配置项setters

在rule.xml中,我们需要配置partitionCount和partitionLength两个配置项。

41

为了让DBLE在函数加载过程中,能够认出这里的partitionCount(值为4)和partitionLength(值为1),因此PartitionByLong类中,就必须有属性设置方法(setter)setPartitionCount()和setPartitionLength()。而因为rule.xml是个文本型的XML文件,所以这些函数的传入参数就只能是一个String,数据类型转换和预处理的动作就由这些setter来处理了。

public void setPartitionCount(String partitionCount) { this.count = toIntArray(partitionCount); /* 参考本文的getAllProperties()的说明 */ propertiesMap.put("partitionCount
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值