ShardingJdbc兼容达梦

ShardingJdbc兼容达梦

​ 本章详细说ShardingJdbc和达梦数据库的扩展和配置问题,ShardingJdbc和DruidDataSource、Mybatis整合的兼容、冲突问题,以及这些问题的解决方案。,干货满满,全网独一份,建议收藏。本章不说ShardingJdbc的用法和配置,这些已经烂大街了,有需要的小伙伴自行找资料,一搜一大堆。

原创文章,转载请注明出处,侵权必究。

ShardingJdbc版本扩展数据库类型问题

原因分析

ShardingJdbc默认不兼容达梦,在 sharding-jdbc-spring-boot-starter:4.0.0-RC1以及更低版本中不支持扩展兼容的数据库类型,因为在该版本中能支持的数据库类型已经被DataSourceMetaDataFactory写死了,其他未支持的数据库则会抛出UnsupportedOperationException

在这里插入图片描述

但在 sharding-jdbc-spring-boot-starter:4.0.0-RC1之后更高的版本中,DataSourceMetaDataFactory类已经不存在,兼容的数据库类型通过SPI机制来配置,官方默认支持的数据库类型在包sahrdingsphere-common包中配置如下:

在这里插入图片描述

解决办法

可以利用该机制扩展数据库元数据和数据库类型,以达到支持达梦数据库,代码如下:

/**
 * 扩展达梦数据库类型
 */
public class DMDatabaseType implements BranchDatabaseType {
    @Override
    public String getName() {
        // 返回达梦名称
        return "DM";
    }

    @Override
    public Collection<String> getJdbcUrlPrefixAlias() {
        return Collections.emptyList();
    }

    @Override
    public DataSourceMetaData getDataSourceMetaData(final String url, final String username) {
        return new DMDataSourceMetaData(url, username);
    }

    @Override
    public DatabaseType getTrunkDatabaseType() {
        return DatabaseTypes.getActualDatabaseType("Oracle");
    }
}
/**
 * 扩展达梦数据库元数据
 */
@Getter
@Slf4j
public class DMDataSourceMetaData implements DataSourceMetaData {
    private static final int DEFAULT_PORT = 5236;

    private final String hostName;

    private final int port;

    private final String catalog;

    private final String schema;

//    private final Pattern pattern = Pattern.compile("jdbc:dm://([\\w\\-.]+):?([0-9]*)", Pattern.CASE_INSENSITIVE);
    /**
     * 匹配达梦url的正则表达式,以来解析主机、端口、用户名和密码等
     */
    private Pattern pattern = Pattern.compile("jdbc:dm://([\\w\\-\\.]+):?([0-9]*)(/?)([\\w\\-]*)", Pattern.CASE_INSENSITIVE);


    public DMDataSourceMetaData(final String url, final String username) {
        Matcher matcher = pattern.matcher(url);
        if (!matcher.find()) {
            throw new UnrecognizedDatabaseURLException(url, this.pattern.pattern());
        }
        hostName = matcher.group(1);
        port = Strings.isNullOrEmpty(matcher.group(2)) ? DEFAULT_PORT : Integer.valueOf(matcher.group(2));
//        catalog = username;
//        schema = username;
        catalog = matcher.group(3);
        schema = username;

        log.info("hostName: " + this.hostName + " port: " + this.port + " url: " + url + " username: " + username + " catalog: " + this.catalog + " schema: " + this.schema);
    }

}

以上代码来源:https://blog.csdn.net/wyl614548134/article/details/135980260

ShardingJdbc、DruidDataSource和Mybatis版本兼容问题

原因分析

sharding-jdbc-spring-boot-starter:4.0.0-RC1以前以及更低版本中,程序启动的时候,ShardingJdbc自动配置类(SpringBootConfiguration)会创建一个名为dataSource的数据源bean,和druid-spring-boot-starter的自动配置类(DruidDataSourceAutoConfigure)产生的数据源bean都为dataSource,名称产生冲突。

在这里插入图片描述

​ 所以需要添加配置spring.main.allow-bean-definition-overriding=true让ShardingJdbc的dataSource覆盖Druid的dataSource,以解决bean name冲突的问题。

​ 而在sharding-jdbc-spring-boot-starter:4.0.0-RC1之后以及更高的版本中,ShardingJdbc自动配置类(SpringBootConfiguration)产生的数据源bean为shardingDataSource,和Druid数据源bean为dataSource不产生冲突,但在IOC容器中会存在shardingDataSourcedataSource两个数据源。

在这里插入图片描述

在IOC容器存在两个数据源会导致时,会导致标注有@Mapper的dao接口注入报错(因为此时并未在IOC容器中生成接口动态代理bean),原因在于mybatis的自动配置类(MybatisAutoConfiguration)不生效,因为该配置类有一个生效条件是,当IOC容器只有一个标注**@Primary**或者有且只有一个类型为DataSource的bean时才生效。

在这里插入图片描述

启动的时候,mybatis的自动配置类(MybatisAutoConfiguration)匹配情况如下:

在这里插入图片描述

解决办法一(推荐):

在spring的配置文件中添加spring.autoconfigure.exclude=com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure,该配置会禁止DruidDataSourceAutoConfigure自动配置失效,从而保证IOC容器中只有一个DataSource,从而使Mybatis的自动配置生效,效果如下:

在这里插入图片描述

解决办法二(看看就行):

ShardingJdbc使用java config的方式配置DataSource,并且添加@Primary注解标注该数据源。但是此时的Druid数据源也要配置,否则会报错。Mybatis自动配置类(MybatisAutoConfiguration)会找标注有@Primary的数据源来进行注入。

ShardingJdbc兼容达梦配置问题

原因分析

当解决以上两个问题之后,项目启动报错,如下:

在这里插入图片描述
原因在于读取到的达梦版本号为:8…05134284132,且使用**分隔符“.”**解析获取到的版本号为空串(“”),强转Integer的时候报错。不同的版本情况不一样,不知道是否有存在解析不报错的版本。

在这里插入图片描述

而版本号8…05134284132 来自于查询该SQLselect top 1 banner, id_code from v$version where banner like 'DM Database Server%';并解析获取,源码如下:
在这里插入图片描述
SQL查询结果如下:

在这里插入图片描述

解决办法

版本号既然是从数据库中通过语句来获取到的,版本号不可能随随便便修改,那如果我修改if (this.connection.compatibleOracle())条件内容,使其返回1,问题不就解决了嘛?开搞!

在这里插入图片描述

而使方法this.connection.compatibleOracle()满足条件,需要使其字段this.compatibleMode=1,如下:

在这里插入图片描述

而该字段的值来源于DmdbConnection.setAttributes()方法解析获得。如下:

在这里插入图片描述
在这里插入图片描述

所以在配置达梦url时,添加参数compatibleMode=oracle,则版本解析报错的问题解决!

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

程序刚启动就报无效的表或视图名

报错条件

如果项目中有该配置spring.shardingsphere.sharding.default-data-source-name=ds0或者spring.shardingsphere.datasource.names=ds0只配置了一个数据源时(只有一个的时候,这个被默认成为了default-data-source-name的值了),则启动的时候就报无效的表或视图名,是的,是启动的时候,如下:

在这里插入图片描述

原因分析

如果配置了default-data-source-name,则会调用SchemaMetaDataLoader.load()

在这里插入图片描述

SchemaMetaDataLoader.load()方法源码如下:

在这里插入图片描述

那如果我指定当前用户的schema,那获取到的不就是我当前用户的所有表了吗,那后续执行的SQL不就不会出现不存在的表或视图了吗?然而,通过Connection.getSchema()来获取是报错,获取不到的,最终被忽略的异常还是返回了null,返回了null,没有指定schema,最后的结果还是查询所有schema的所有表。
在这里插入图片描述
在这里插入图片描述

解决办法

删除spring.shardingsphere.sharding.default-data-source-name=ds0配置,default-data-source-name值为空,则走另外的分支,则不报错!

项目源代码

项目所涉及到的源代码由于提交记录,以及后续要继续提交,存在敏感信息,所以该仓库就不公开也不公布了,需要到原代码demo,请往此处下载(csdn改了,积分规则不能由自己设置了,变成动态分配了,所以改不了为0):ShardingJdbc兼容达梦demo

原创文章,转载请注明出处,侵权必究。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/513042.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数码论坛系统的设计与实现|Springboot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)电子科技数码爱好者交流信息新闻畅聊讨论评价

本项目包含可运行源码数据库LW&#xff0c;文末可获取本项目的所有资料。 推荐阅读300套最新项目持续更新中..... 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含ja…

680.验证回文串II-力扣

680.验证回文串II-力扣 给你一个字符串 s&#xff0c;最多可以从中删除一个字符。 请你判断 s 是否能成为回文字符串&#xff1a;如果能&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false。 示例1&#xff1a; 输入&#xff1a;s “aba” 输出&#xff1a;true示…

Python就业前景如何?薪资待遇怎么样?

前言 Python作为一种高级编程语言&#xff0c;已经在多个领域得到了广泛的应用&#xff0c;包括数据分析、人工智能、Web开发等。随着技术的不断发展和应用领域的不断扩展&#xff0c;Python的就业前景也越来越广阔。 首先&#xff0c;Python在数据分析领域的应用非常广泛。随…

mac | Windows 本地部署 Seata2.0.0,Nacos 作为配置中心、注册中心,MySQL 存储信息

1、本人环境介绍 系统 macOS sonama 14.1.1 MySQL 8.2.0 &#xff08;官方默认是5.7版本&#xff09; Seata 2.0.0 Nacos 2.2.3 2、下载&数据库初始化 默认你已经有 Nacos、MySQL&#xff0c;如果没有 Nacos 请参考我的文章 &#xff1a; Docker 部署 Nacos&#xff08;单机…

滴滴盈利,司机“受伤”

近日&#xff0c;滴滴对外披露了2023年Q4及全年业绩。 财报数据显示&#xff0c;2023年Q4&#xff0c;滴滴实现营收494亿元&#xff0c;同比增长55.4%&#xff0c;净利润达11亿元&#xff1b;2023年全年滴滴实现营收共计1924亿元&#xff0c;同比增长36.6%&#xff0c;净利润达…

springboot对接minio的webhook全过程

前言 近日需要将minio的apache2.0版本给用起来&#xff0c;顺便要完善一下原有的文件上传管理系统&#xff0c;其中很重要的一点是&#xff0c;在原有客户端直传的基础上&#xff0c;再添加 minio 的上传回调给服务端做后续处理。 本文重点在于&#xff0c;介绍整个minio与spr…

MySQL生产环境常见故障及解决方案汇总

MySQL生产环境常见故障及解决方案汇总 1. MySQL主从同步异常故障1.1. 情景说明1.2. 排查过程1.3. 数据同步2. MySQL慢查询故障1. MySQL主从同步异常故障 1.1. 情景说明 MySQL主库网卡需要更换IP地址,并将原IP地址配置为MySQL集群的VIP地址,上层应用程序其实不需要更改连接My…

VUE——生命周期

概念&#xff1a; mounted:挂载 new Vue({el: "#x",data: {},methods: {},mounted() {}, }) 系统会自己调用&#xff0c;不需要我们调用。 案例 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><…

JavaScript(五)---【DOM】

零.前言 JavaScript(一)---【js的两种导入方式、全局作用域、函数作用域、块作用域】-CSDN博客 JavaScript(二)---【js数组、js对象、this指针】-CSDN博客 JavaScript(三)---【this指针&#xff0c;函数定义、Call、Apply、函数绑定、闭包】-CSDN博客 JavaScript(四)---【执…

在 Windows 中安装部署并启动连接 MongoDB 7.x(命令行方式启动、配置文件方式启动、将启动命令安装为系统服务实现开机自启)

MongoDB 的下载 下载地址&#xff1a;https://www.mongodb.com/try/download/community 这里需要对 MongoDB 的版本号说明一下&#xff1a; MongoDB 版本号的命名规则是 x.y.z&#xff0c;当其中的 y 是奇数时表示当前的版本为开发版&#xff0c;当其中的 y 是偶数时表示当前的…

“多组数组”题的注意事项,天杀的“鲁棒性”

【题目描述】 输入一些整数&#xff0c;求出它们的最小值、最大值和平均值&#xff08;保留3位小数&#xff09;。输入保证这些数都是不超过1000的整数。 输入包含多组数据&#xff0c;每组数据第一行是整数个数n&#xff0c;第二行是n个整数。n&#xff1d;0为输入结束标记&…

日志服务 HarmonyOS NEXT 日志采集最佳实践

作者&#xff1a;高玉龙&#xff08;元泊&#xff09; 背景信息 随着数字化新时代的全面展开以及 5G 与物联网&#xff08;IoT&#xff09;技术的迅速普及&#xff0c;操作系统正面临前所未有的变革需求。在这个背景下&#xff0c;华为公司自主研发的鸿蒙操作系统&#xff08…

经典文献阅读之--LOG-LIO(高效局部几何信息估计的激光雷达惯性里程计)

0. 简介 局部几何信息即法线和点分布在基于激光雷达的同时定位与地图构建&#xff08;SLAM&#xff09;中是至关重要&#xff0c;因为它为数据关联提供了约束&#xff0c;进一步确定了优化方向&#xff0c;最终影响姿态的准确性。然而即使在使用KD树或体素图的辅助下&#xff…

echarts 毕节区县地图 包含百管委、高新区 (手扣)

百度网盘 链接&#xff1a;https://pan.baidu.com/s/14yiReP8HT_bNCGMOBajexg 提取码&#xff1a;isqi

【Qt 学习笔记】Qt 开发环境的搭建 | Qt 安装教程

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt 开发环境的搭建 | Qt 安装教程 文章编号&#xff1a;Qt 学习笔记 /…

坦克大战_java源码_swing界面_带毕业论文

一. 演示视频 坦克大战_java源码_swing界面_带毕业论文 二. 实现步骤 完整项目获取 https://githubs.xyz/y22.html 部分截图 启动类是 TankClinet.java&#xff0c;内置碰撞检测算法&#xff0c;线程&#xff0c;安全集合&#xff0c;一切皆对象思想等&#xff0c;是java进阶…

Annaconda的替代品miniforge!

用了多年的Annaconda竟然要收费了&#xff08;个人不收费&#xff0c;企业收费&#xff0c;但个人电脑在企业IP下&#xff0c;还是被警告了&#xff09;&#xff0c;只能用miniforge 全面替换了&#xff01; 一、卸载anaconda windows下卸载&#xff0c; 设置 -> 应用和功…

后台返回数据需要自己匹配图标,图标命名与后台返回的变量保持一致

testItemId为后台返回匹配图标的变量名 sportsTargetsData:{suggestSportTargetId: "2",unlocks: [{ testItemId: vo2max_high_knee, sportTargetName: 心肺能力, indexName: 心肺能力, sportTargetId: 1 },{ testItemId: grip_strength, sportTargetName: 基础力量…

基于YOLOV5+Pyqt5农作物叶片病害检测系统

1、引言 农作物病害的精准检测与识别是推动农业生产智能化与现代化发展的重要举措。随着计算机视觉技术的发展&#xff0c;深度学习方法已得到快速应用&#xff0c;利用卷积神经网络进行农作物病害检测与识别成为近年来研究的热点。基于传统农作物病害识别方法&#xff0c;分析…

瑞吉外卖实战学习--13、完善删除中的逻辑

完善删除中的逻辑 前言效果图逻辑介绍表结构根据mybatisPlus接口规范创建实体类和service和mapper文件1、实体类Dish和Setmeal2、Mapper接口DishMapper和SetealMapper3、Service接口DishService和setmealService4、Service实现类DishServiceImpl和setmealServicelmpl 编写删除函…