前言

由于数据量的增长,我们项目的MySQL数据库逐渐力不从心了,经过分析,决定对数据量特别大几张表做水平分表,考虑到公司使用DevOps做运维,想加入MyCat中间件十分困难,因此决定尝试使用更为轻便的Sharding JDBC。查看官方网站后发现目前最新版为4.0.1版本,于是打算做一次吃螃蟹的人。下面主要记录集成过程中遇到的坑。

正文

由于我们项目中用到了springboot 2.1.0,因此在pom中引入jar包:

<!-- for spring boot -->
<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
    <version>${sharding-sphere.version}</version>
</dependency>

接下来参照官方配置手册对application.yml进行了配置,注释掉了之前的dataSource。分别实现PreciseShardingAlgorithm和RangeShardingAlgorithm接口,完成了分表业务逻辑开发。然后启动项目,报错找不到数据源。打开IDEA的Project Structure:

发现lib里面并没有正确引入shardingsphere相关依赖,于是在lib上点击右键选择add copy of添加了依赖。再次启动项目报错:

java.lang.ClassNotFoundException: com.google.common.base.Function

经过查询发现是缺少selenium-server-standalone.jar导致的,于是上maven中央仓库查询发现最新版本为2.53.0,于是引入:

            <dependency>
                <groupId>org.seleniumhq.selenium</groupId>
                <artifactId>selenium-server-standalone</artifactId>
                <version>2.53.0</version>
            </dependency>

最坑的来了,再次启动项目报错:

java.lang.NoSuchMethodError: org.yaml.snakeyaml.Yaml.<init>(Lorg/yaml/snakeyaml/constructor/BaseConstructor;Lorg/yaml/snakeyaml/representer/Representer;Lorg/yaml/snakeyaml/DumperOptions;Lorg/yaml/snakeyaml/LoaderOptions;Lorg/yaml/snakeyaml/resolver/Resolver;)V

于是根据异常信息找到OriginTrackedYamlLoader.java:70如下:

return new Yaml(constructor, representer, dumperOptions, loaderOptions, resolver);

构造函数不存在,我点击ctrl跟进Yaml类发现引用的是org.seleniumhq.selenium.selenium-server-standalone.jar下面的Yaml类,这个类中确实没有5个参数的构造函数。而springboot2.1.0中带的org.yaml.snakeYaml-1.23.jar中的Yaml是有这个构造函数的,这两个不同jar包中的类路径完全重复了。于是尝试从pom中用exclusion的方式排除错误的Yaml类,但elenium-server-standalone.jar中的Yaml类并不是引用的jar所以无法排除,尝试失败,于是考虑改变class加载顺序,当存在重复类时,先加载的类会成功,后加载的会被舍弃。

经过查询得到的方法是修改classpath里面的顺序,IDEA只有iml文件,于是把selenium-server-standalone.jar丢到了最后,测试无效。

于是尝试修改Project Structure的Modules中的Dependencies顺序,仍然无效。

最后居然想出了一个奇招,重新用Maven install  selenium-server-standalone.jar这个包,修改其groupId和artifactId,分别在前面加上一个z使该包排序在最后。

mvn install:install-file -Dfile=D:\chromeDownloads\selenium-server-standalone-2.53.0.jar -DgroupId=zorg.seleniumhq.selenium -DartifactId=zselenium-server-standalone -Dversion=2.53.0 -Dpackaging=jar

然后启动项目,居然成功了。

但这个方法始终不是很放心,然后搜索了一下selenium-server-standalone.jar发现2.53.0并不是最新版,最新版本是4.0.0-alpha-2。

下载地址

漫长的下载后,安装到本地maven仓库,修改依赖版本,启动项目,成功!

但是进行数据库查询时还是报错了。最后引入依赖:

<dependency>
                <groupId>org.antlr</groupId>
                <artifactId>antlr4-runtime</artifactId>
                <version>4.7.2</version>
            </dependency>

终于分表成功了。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐