5.2.2.2.2. 路由规则类型详解(Rule )
路由规则的定义初看起来简单, 但到底应该如何定义, 以及为什么要如此定义, 在没有为你揭开这些疑问之前,我想,你还是很难搞清楚这些路由规则定义到底是怎么回事, 不过没关系,我们现在就为你揭开这些疑团.
在使用进行数据访问的时候,我们通常会定义相关的文件, 例如:
?xml ="1.0" =""?! "-//.com//DTD SQL Map 2.0//EN" "" ="com....." ="" type="com....." / id="" ="" ="id"="id" / =""="" / =""="" / =""="" // id="" INTO (, , ) (##, ##, ##) ="id" ="long" ();//.../其中, 每个都会对应一个, 在该下, 可以定义多个sql ,而每个又会有相应的id作为其标志,其中, + id可以唯一标志一个全局的, 在这一前提下,让我们来看如何根据现有的的定义来进行数据访问的路由.
我们本着从特殊到一般的情况进行推演.
以操作为例, 假设我们的数据现在分布在两台数据库上, 而根据切分规则,为奇数的数据分布在数据库1上, 为偶数的数据分布在数据库2上,在这一前提下,要路由的创建相关的数据请求, 最明了的方式就是, 检查当前数据访问对应的sql 是哪个,并判断传入的参数包含的是奇数还是偶数,这样, 我们就有了以下2个路由规则定义:
....../ % 2 == 1///....../ % 2 == 0///rule/元素对应唯一的sql 标志, 即 + sql , 对应切分规则的定义,而则对应最终的路由结果.现在, 我想你应该对路由规则的如上定义有了初步的了解了吧!
有了以上的基础, 我们来变换假设场景, 我们依然是操作, 但现在我们不是做的水平切分, 而只是做垂直切分, 也就是说,所有的数据现在假设都会落在同一台数据库上, 那么,以上的定义可以变更为:
....../ % 2 == 1///....../ % 2 == 0///rule/?xml ="1.0" =""?! "-//.com//DTD SQL Map 2.0//EN" "" ="com....." ="" type="com....." / id="" ="" ="id"="id" / =""="" / =""="" / =""="" // id="" INTO (, , ) (##, ##, ##) ="id" ="long" ();// id="" SET =##, =## id=#id#/ id="" from id=#id#/.../如果只有和(Only)Rule的支持,要保证更新和删除操作能够被正确的路由到指定的数据库, 我们就得根据切分规则,再路由规则定义文件中再为更新和删除操作添加相应的路由规则定义.这样做的问题在于:
没添加一个针对某表的文件, 就需要在路由规则定义文件中添加一系列的CURD操作对应的路由定义,从使用的角度来看, 很繁琐;
通常针对某个表的操作, 切分规则都是相同的, 不管具体数据访问操作是什么, 也就是说, 通常定义一套路由规则,原则上来讲应该可以满足CURD多个数据操作的路由.
鉴于以上两点,我们又引入了和(Only)Rule的概念.
允许我们基于中的和水平切分规则进行路由规则的定义,同样针对最初的切分规则, 即为奇数的数据落在数据库1上, 而为偶数的数据落在数据库2上,那不管其操作是创建还是更新, 只要数据访问对应的落在指定的下(对应我们的情况就是com.....命名空间),并且数据访问参数符合指定的切分规则, 我们就可以正确的路由数据访问请求,最终我们可以给出如下的路由规则定义:
...../ % 2 == 1///...../ % 2 == 0///rule/进一步的,如果所有数据只是水平切分,那跟和(Only)Rule的差别类似,我们也可以只使用(Only)Rule:
.....///rule/现在, 定义在com.....命名空间下的所有, 将全部被路由到数据库执行.
可以看到, 从到(Only)Rule,一直到和(Only)Rule,路由规则涵盖的面是从特殊到一般层面逐步放开的,如果针对某个sql 有特殊的路由需求,那么可以根据情况添加相应的或者(Only)Rule, 而如果多个拥有相近或者相同的路由需求,那么,就可以根据情况归纳并添加相应的或者(Only)Rule, 总之,这四种类型的Rule类型可以组合使用, 全面的覆盖整个基于的数据访问请求的路由.
Tip在定义路由规则的过程中,可以从一般情况下的或者(Only)Rule着手,首先定义一般情况下的路由规则,然后在根据某些特殊数据访问请求,进一步添加或者(Only)Rule类型的路由规则.在进行路由的时候, 将首先进行特殊情况下的路由规则匹配,当找不到匹配规则的时候, 在进一步的使用一般的路由规则作为后备规则进行匹配.
5.2.2.2.3. 自定义路由规则函数( Rule )
常见的水平切分规则有:
基于范围的切分, 比如 and
基于模数的切分, 比如 %128==1 或者 %128==2 或者...
基于哈希()的切分, 比如()==等
另外, 还有诸如- 等, 为了满足不同切分规则定义的需要,我们运行在路由规则定义的时候, 在中使用自定义的路由规则函数.
下面我们以一个简单的实例来说明在 中如何自定义使用路由规则函数.
假设我们要按照某种算法对进行散列, 并根据散列的值进行路由, 那么首先,我们需要定义一个函数类,该类将根据传入的返回相应的散列结果:
{...int (Long ){// real here.}}有了该函数定义,我们希望在中使用它, 那首先我们需要注册该函数,这通过的“”属性进行:
bean id=""="com......" name="" key="hash"bean =".."/bean//map/ name="":META-INF//-sql--.xml/:META-INF//---on-.xml//list//bean注意,我们以hash作为key对以上自定义函数进行了注册.
有了以上准备之后, 我们就可以在中使用该自定义函数了:
...../.() == ///...../.() == ///rule/可见只要使用注册时用的key作为对象应用针对指定的表达式字段调用相应的方法就是了. 简单, 却不失强大.