目录
版本:5.1.0
注意点 及 易犯错误:
1. inline表达式
不能这样写:
t_order_${2..7}
要这样写:
t_order_$->{2..7}
原因见官网:
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),所以肯定是由默认的执行策略的)
3. 项目中一些第三方jar包的版本对应
guava: 以前项目是18.0(因为被biz.paluch.redis:lettuce:jar:4.2.2.Final:引用,一个用于操作redis 的jar包),改为27.1-jre可以正常使用。所以排除lettuce对guava的包,然后引用新包即可。
<dependency>
<groupId>biz.paluch.redis</groupId>
<artifactId>lettuce</artifactId>
<version>4.2.2.Final</version>
<exclusions>
<exclusion>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>27.1-jre</version>
</dependency>
mysql驱动:以前是5.1.3,改成了5.1.47
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
mysql版本:由于驱动升级,对应的mysql版本以前是5.7.24,会出现连接时候报ssl握手失败的错误,升级mysql为5.7.33后正常使用
druid连接池版本:原1.1.9,升级为1.2.8可以使用
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.8</version>
</dependency>
4. sharding-jdbc包内部存在的版本依赖问题
1. 启动时报连接池错误:
java.lang.NoClassDefFoundError: org/apache/tomcat/dbcp/dbcp2/BasicDataSource
在master分支已经修复(注意本文的编写时间 2022/03/14),官方已经在github的issue上回答了,结局方案为加入tomcat的dbcp连接池,或者考虑使用最新master或者版本。
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-dbcp</artifactId>
<version>10.0.16</version>
</dependency>
issue地址:https://github.com/apache/shardingsphere/issues/16116https://github.com/apache/shardingsphere/issues/161162. sharding-sphere本身内置的guava也不能使用。
需要排除掉其内部引用的guava(内部引用的版本为:30.0-jre),并在项目中使用上面提到的guava版本
<shardingshpere.versoin>5.1.0</shardingshpere.versoin>
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>shardingsphere-jdbc-core</artifactId>
<version>${shardingshpere.versoin}</version>
<exclusions>
<exclusion>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>shardingsphere-jdbc-core-spring-namespace</artifactId>
<version>${shardingshpere.versoin}</version>
<exclusions>
<exclusion>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</exclusion>
</exclusions>
</dependency>