sharding-jdbc v5.1.0与 springmvc整合随笔

目录

注意点 及 易犯错误:

1. inline表达式

2. 自定义分片算法不起作用?

3. 项目中一些第三方jar包的版本对应

4. sharding-jdbc包内部存在的版本依赖问题


版本: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),所以肯定是由默认的执行策略的)

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>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值