ShardingJdbc兼容达梦

2024-04-03 15:20
文章标签 兼容 达梦 shardingjdbc

本文主要是介绍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 {@Overridepublic String getName() {// 返回达梦名称return "DM";}@Overridepublic Collection<String> getJdbcUrlPrefixAlias() {return Collections.emptyList();}@Overridepublic DataSourceMetaData getDataSourceMetaData(final String url, final String username) {return new DMDataSourceMetaData(url, username);}@Overridepublic 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

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

这篇关于ShardingJdbc兼容达梦的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/873280

相关文章

zeroclipboard 粘贴板的应用示例, 兼容 Chrome、IE等多浏览器

zeroclipboard单个复制按钮和多个复制按钮的实现方法 最近网站改版想让复制代码功能在多个浏览器上都可以实现,最近看网上不少说我们的代码复制功能不好用的,我们最近将会增加代码高亮等功能,希望大家多多支持我们 zeroclipboard是一个跨浏览器的库类 它利用 Flash 进行复制,所以只要浏览器装有 Flash 就可以运行,而且比 IE 的

你的应用与Solaris 11兼容吗?

用户现在可以下载开发者预览版的Solaris 11,它内置在名为Solaris 11 Express的软件产品中,甲骨文已在去年11月发布了该产品。如今,甲骨文发布了一款新的甲骨文Solaris 11兼容性检查工具(Oracle Solaris 11 Compatibility Checker Tool),加强了Solaris 11方面的开发工作。对于甲骨文和Solaris的用户来说,这是重

关于iReport5.6.0无法正常启动或者闪退或者JDK8不兼容的解决方案

我下载了iReport5.6.0 版本的,启动不起来;jdk 1.8 下载iReport5.6.0地址:https://download.csdn.net/download/u013456370/10589765 参考链接:https://blog.csdn.net/erlian1992/article/details/76359191?locationNum=6&fps=1 如果是停留在这

三维布尔运算对不规范几何数据的兼容处理

1.前言 上一篇文章谈过八叉树布尔运算,对于规范几何数据的情况是没有问题的。 在实际情况中,由于几何数据来源不一,处理和生成方式不一,我们无法保证进行布尔运算的几何数据都是规范的,对于不规范情况有时候也有需求,这就需要兼容不规范数据情况,当然这种兼容不是一味的让步,而是对于存在有限的不规范数据的兼容处理。 2.原始数据示例 下图是一个大坝模型和之上要对其进行布尔运算的立方体。 大坝模型由

兼容Trino Connector,扩展Apache Doris数据源接入能力|Lakehouse 使用手册(四)

Apache Doris 内置支持包括 Hive、Iceberg、Hudi、Paimon、LakeSoul、JDBC 在内的多种 Catalog,并为其提供原生高性能且稳定的访问能力,以满足与数据湖的集成需求。而随着 Apache Doris 用户的增加,新的数据源连接需求也随之增加。因此,从 3.0 版本开始,Apache Doris 引入了 Trino Connector 兼容框架。 Tri

Qt5.4.1连接odbc驱动操作达梦数据库

Qt5.4.1连接odbc驱动操作达梦数据库 1 环境介绍2 Qt5.4.1 安装2.1 图形化界面安装Qt5.4.12.2 配置Qt5.4.1 环境变量2.3 Qt5.4.1 生成 libqsqlodbc.so 并配置2.3.1 生成Makefile2.3.2 查看 libqsqlodbc.so 文件并配置 3 配置Qt测试用例4 达梦数据库学习使用列表 1 环境介绍 CPU

报错:Reached the max session limit(DM8 达梦数据库)

报错:Reached the max session limit - - DM8 达梦数据库 1 环境介绍2 数据库启动SYSTEM IS READY后面日志3 数据库刚启动日志4 达梦数据库学习使用列表 1 环境介绍 某项目无法连接数据库,报错:超过最大会话数限制 , 检查 dmdba ulimit -a openfiles 已改检查 dm.ini 其中 MAX_SESSION

【达梦数据库】误删数据库目录问题复现解决方式

目录 1、环境搭建1.1、查询数据库版本1.2、创建表1.3、插入数据1.4、查询数据 2、故障重演2.1、服务器内直接删除整个库文件2.2、查询数据:数据可查2.3、查看进程:进程存在2.4、查看proc进程文件:deleted 3、数据恢复3.1、逻辑导出导入-(数据丢失,废弃)3.1.1、全库导出3.1.2、重新初始化库3.1.3、全库导入3.1.4、查询数据:数据丢失

多字节、宽字节、兼容字节(TEXT) 相关操作汇总

常用函数对照 ANSIUNICODE通用说明数据类型(char.h)(wchar.h)(tchar.h) charwchar_tTCHAR char *wchar_t *TCHAR* LPSTRLPWSTRLPTSTR LPCSTRLPCWSTRLPCTSTR     字符串转换atoi_wtoi_ttoi把字符串转换成整数(int)atol_wtol_ttol把字符串转换成长整型数(long)

android 兼容API的检查

读之前可以了解一下api levels的知识:Android中文翻译组的:Android开发者指南(10) —— Android API Levels 一,使用高版本API要注意的问题 在项目开发中:由于经验和其他条件的制约,如没有查看API出现的版本,对过时API没有作兼容等等。 可能出现下面的问题: 当你的代码使用一个高版本的API, 应用运行