版本:5.1.0
注意点 及 易犯错误:
1. inline表达式
不能这样写:
t_order_${2..7}
要这样写:
?t_order_$->{2..7}
原因见官网:
数据分片 :: ShardingSpherehttps://shardingsphere.apache.org/document/current/cn/user-manual/shardingsphere-jdbc/spring-namespace/rules/sharding/
2. 自定义分片算法不起作用?
????????自定义分片算法后,执行的时候没有执行我的分片算法的doSharding方法?但是启动时执行了init()方法?而且执行查询时没有执行doSharding方法却不报错,并且返回空数据,同时执行插入操作时还报错:
Insert statement does not support sharding table routing to multiple data nodes.
原因:
????????我的情况是,我在配置
<sharding:sharding-algorithm id="算法名称_1"/>
???的时候,id的值填写错了,写成了“算法名称_1”。而本来想要引用它的标签
<sharding:standard-strategy algorithm-ref="算法名称_2"/>中的id写的是“算法名称_2”。
? ? ? ? 也就是想要引用算法的策略标签中写错了算法的id
详情比如:
<sharding:standard-strategy id="orderTableStrategy" sharding-column="order_str_id"
algorithm-ref="inlineOrderTableStrategyAlgorithm"/>
<!--CLASS_BASED方式-->
<sharding:sharding-algorithm id="inlineOrderItemTableStrategyAlgorithm" type="CLASS_BASED">
<props>
<prop key="strategy">standard</prop>
<prop key="algorithmClassName">
com.jfqqqq.test.persist.ClassBasedOrderStandardShardingAlgorithmFixture
</prop>
</props>
</sharding:sharding-algorithm>
? ? ? ? <sharding:standard-strategy/> 标签的 'algorithm-ref' 属性标明引用的是"inlineOrderTableStrategyAlgorithm"算法,但是我在<sharding:sharding-algorithm/>中的id写错了,写成了“inlineOrderItemTableStrategyAlgorithm”。
所以:
? ? ? ? 1. 不能调用doSharding方法是因为没绑定上这个策略;
? ? ? ? 2. 而init函数会被执行是因为在标签里声明了这个策略,于是在初始化时就会被执行创建,只不过没有被使用罢了;
? ? ? ? 3. 至于报的错误,显而易见,是因为我的数据库操作实体类没能绑定上策略,所以sharding-jdbc就执行了它内部的一个默认的策略,而内部策略不支持insert的分表,以及查询在效果上只默认查询第一个实际表,此时如果第一个实际表里没有命中数据,就会返回空数据了。(具体是的默认行为是什么还没有看源码呢,不过通过将逻辑数据表的第一个实际表删除(比如order_$->{0..3}的0删除),就可以发现报错找不到表(Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'test.order_0' doesn't exist),所以肯定是由默认的执行策略的)
|