动态数据源实现分表走shardingsphere,不分表走其他

shardingsphere从4.1.1升级到5.2.1但是还没有完结,因为在执行存储过程的时候,系统提示错误如下。shardingsphere是不支持存储过程呢,但项目中不能避免使用存储过程,因为有大量的数据需要初始化,这种情况该如何应对?

### SQL: {call init_data(                 ?,                 ?,                 ?                 )                 }
Caused by: java.sql.SQLFeatureNotSupportedException: prepareCallat org.apache.shardingsphere.driver.jdbc.unsupported.AbstractUnsupportedOperationConnection.prepareCall(AbstractUnsupportedOperationConnection.java:43)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at org.apache.ibatis.logging.jdbc.ConnectionLogger.invoke(ConnectionLogger.java:55)at com.sun.proxy.$Proxy170.prepareCall(Unknown Source)at org.apache.ibatis.executor.statement.CallableStatementHandler.instantiateStatement(CallableStatementHandler.java:87)at org.apache.ibatis.executor.statement.BaseStatementHandler.prepare(BaseStatementHandler.java:88)at org.apache.ibatis.executor.statement.RoutingStatementHandler.prepare(RoutingStatementHandler.java:59)at sun.reflect.GeneratedMethodAccessor358.invoke(Unknown Source)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at org.apache.ibatis.plugin.Invocation.proceed(Invocation.java:49)

既然存储过程并不涉及分片的表,为何shardingsphere还会干预呢?
使用Hikari可以看到下面的日志

JDBC Connection [HikariProxyConnection@289895964 wrapping com.mysql.cj.jdbc.ConnectionImpl@164ef602] will not be managed by Spring

如果被shardingsphere管理则可以看到下面的日志

JDBC Connection [org.apache.shardingsphere.driver.jdbc.core.connection.ShardingSphereConnection@6e64e072] will not be managed by Spring

因为shardingsphere不支持存储过程及一些语句,所以产生了动态数据源的需求,在网上找的例子配置,Mybatis-plus@DS实现动态切换数据源应用


import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
import com.baomidou.dynamic.datasource.provider.AbstractDataSourceProvider;
import com.baomidou.dynamic.datasource.provider.DynamicDataSourceProvider;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceAutoConfiguration;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceProperties;
import org.apache.shardingsphere.driver.jdbc.adapter.AbstractDataSourceAdapter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;import org.springframework.context.annotation.Lazy;
import javax.annotation.Resource;
import javax.sql.DataSource;
import java.util.Map;@Configuration
@AutoConfigureBefore({DynamicDataSourceAutoConfiguration.class,SpringBootConfiguration.class})
public class DataSourceConfig {/*** 分表数据源名称*/private static final String SHARDING_DATA_SOURCE_NAME = "acc_sharding";@Autowiredprivate DynamicDataSourceProperties properties;@Lazy@Resource(name = "shardingDataSource")AbstractDataSourceAdapter shardingDataSource;@Beanpublic DynamicDataSourceProvider dynamicDataSourceProvider() {Map<String, DataSourceProperty> datasourceMap = properties.getDatasource();return new AbstractDataSourceProvider() {@Overridepublic Map<String, DataSource> loadDataSources() {Map<String, DataSource> dataSourceMap = createDataSourceMap(datasourceMap);// 将 shardingjdbc 管理的数据源也交给动态数据源管理dataSourceMap.put(SHARDING_DATA_SOURCE_NAME, shardingDataSource);return dataSourceMap;}};}@Primary@Beanpublic DataSource dataSource(DynamicDataSourceProvider dynamicDataSourceProvider) {DynamicRoutingDataSource dataSource = new DynamicRoutingDataSource();dataSource.setPrimary(properties.getPrimary());dataSource.setStrict(properties.getStrict());dataSource.setStrategy(properties.getStrategy());dataSource.setProvider(dynamicDataSourceProvider);dataSource.setP6spy(properties.getP6spy());dataSource.setSeata(properties.getSeata());return dataSource;}}

上面的java配置,还有一个问题没有解决,那就是shardingDataSource这个数据源是怎么初始化的。因为shardingsphere5.2.1没有默认数据源,因此只好先降到5.1.1,Shardingsphere5.1.1 整合druid动态数据源,
5.1.1中需要去掉下面的配置,因为不支持
1
shardingsphere5.x整合springboot+dynamic-datasource多数据源实战
切到5.1.1上面的动态数据源代码是有问题的,因为5.1.1版本自动装载的shardingSphereDataSource beanName=“shardingSphereDataSource”
动态数据源是好的,但带来的问题却是数据库初始化连接过多,如下面的配置,每个系统就有两份数据库连接池配置,这个需要注意,在k8s扩展服务的时候应该考虑到这一点

 @Lazy@Autowiredprivate DataSource  shardingDataSource;

如果按照这个结论,那么将版本再切到5.2.1会怎么样呢?猜想有些地方应该还是会继承把。这个猜想是对的。
配置如下

spring:datasource:dynamic:hikari: # 全局hikariCP参数pool-name: Retail_HikariCP #连接池名称minimum-idle: 5 #最小空闲连接数量idle-timeout: 120000 #空闲连接存活最大时间,默认600000(10分钟)maximum-pool-size: 10 #连接池最大连接数,默认是10auto-commit: true  #此属性控制从池返回的连接的默认自动提交行为,默认值:truemax-lifetime: 1800000 #此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认1800000即30分钟connection-timeout: 30000 #数据库连接超时时间,默认30秒,即30000connection-test-query: SELECT 1datasource:master:type: com.zaxxer.hikari.HikariDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverusername: rootpassword: ENC(xxx)url: jdbc:mysql://127.0.0.1:3306/acc?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true#  数据库配置shardingsphere: mode:type: Standalonerepository:type: JDBCdatasource:names: acc1acc1:type: com.zaxxer.hikari.HikariDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverusername: rootpassword: ENC(xxx)jdbcUrl: jdbc:mysql://127.0.0.1:3306/acc?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=truepool-name: Retail_HikariCP #连接池名称minimum-idle: 5 #最小空闲连接数量#idle-timeout: 600000 #空闲连接存活最大时间,默认600000(10分钟)maximum-pool-size: 10 #连接池最大连接数,默认是10auto-commit: true  #此属性控制从池返回的连接的默认自动提交行为,默认值:true#max-lifetime: 600000 #此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认1800000即30分钟connection-timeout: 300000 #数据库连接超时时间,默认30秒,即30000connection-test-query: SELECT 1props:sql:show: truesharding:default-data-source-name: acc1rules:sharding:tables:# 科目acc_account_subject:actual-data-nodes: acc1.acc_account_subject_$->{0..49}table-strategy:standard:sharding-column: as_idsharding-algorithm-name: acc_account_subject-inline# 科目余额acc_account_balance:actual-data-nodes: acc1.acc_account_balance_$->{0..49}table-strategy:standard:sharding-column: as_idsharding-algorithm-name: acc_account_balance-inline# 期初acc_initial_balance:actual-data-nodes: acc1.acc_initial_balance_$->{0..49}table-strategy:standard:sharding-column: as_idsharding-algorithm-name: acc_initial_balance-inline# 凭证acc_voucher:actual-data-nodes: acc1.acc_voucher_$->{0..49}table-strategy:standard:sharding-column: as_idsharding-algorithm-name: acc_voucher-inline# 凭证分录acc_voucher_entry:actual-data-nodes: acc1.acc_voucher_entry_$->{0..49}table-strategy:standard:sharding-column: as_idsharding-algorithm-name: acc_voucher_entry-inlinebindingTables:- acc_account_subject,acc_account_balance,acc_initial_balance,acc_voucher,acc_voucher_entrysharding-algorithms:acc_account_subject-inline:type: inlineprops:algorithm-expression: acc_account_subject_$->{as_id%50}acc_account_balance-inline:type: inlineprops:algorithm-expression: acc_account_balance_$->{as_id%50}acc_initial_balance-inline:type: inlineprops:algorithm-expression: acc_initial_balance_$->{as_id%50}acc_voucher-inline:type: inlineprops:algorithm-expression: acc_voucher_$->{as_id%50}acc_voucher_entry-inline:type: inlineprops:algorithm-expression: acc_voucher_entry_$->{as_id%50}

在java侧,针对分表的还需要加上注解@DS,一般用在mapper、service上


否则会提示

### Cause: java.sql.SQLSyntaxErrorException: Table 'acc.acc_account_subject' doesn't exist
; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Table 'acc.acc_account_subject' doesn't existat java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:273)at java.util.concurrent.CompletableFuture.completeThrowable(CompletableFuture.java:280)at java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1592)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)at java.lang.Thread.run(Thread.java:748)
Caused by: org.springframework.jdbc.BadSqlGrammarException: 
### Error querying database.  Cause: java.sql.SQLSyntaxErrorException: Table 'acc.acc_account_subject' doesn't exist
### The error may exist in com/whty/acc/setting/dao/AccStatementAsMapper.java (best guess)

分表的数据直接在service上加上注解
1
关联方,在具体的方法上加,这些第一感觉有些侵入性,但是也还好,提醒其他工程师,这个代码要注意分表,这样好像也没有错。
再怎么原生的mybatis,比shardingsphere再转义一道,还是要快些。
1

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI绘梦师新项目歪门邪道2.0游戏玩法,仅需拷贝,一键生成,单日盈利500

我们今天要介绍的项目是“AI绘梦师新项目歪门邪道2.0游戏玩法”。这个项目的核心是利用AI技术帮助企业将用户的梦境转化为美术作品。操作起来非常简单&#xff0c;只需复制用户描述的梦境内容&#xff0c;然后将其输入到AI绘画软件中&#xff0c;软件就能自动生成相应的画作。 …

APP开发突增20倍!安卓和鸿蒙你站哪边?

随着科技的快速发展&#xff0c;智能设备已经成为我们生活中不可或缺的一部分。 根据不少业内人士爆料&#xff0c;今年9月华为将发布mate70系列&#xff0c;而同时华为自己也官宣了"鸿蒙星河版"&#xff0c;也就是原生鸿蒙系统&#xff0c;将于今年4季度商用。这很…

顶顶通呼叫中心中间件-SIP分机安全(mod_cti基于FreeSWITCH)

介绍 运行在公网的FreeSWITCH服务器&#xff0c;每天都会接收到很多恶意的呼叫请求和注册请求&#xff0c;尝试盗打电话。合理的配置可以防止电话给倒打&#xff0c;但是每天大量的攻击&#xff0c;会让FS产生很多日志&#xff0c;降低FreeSWITCH的处理能力&#xff0c;cti模块…

Python实现时间序列ARIMA模型(附带超详细理论知识和完整代码实现)

文章目录 0 结果1 介绍2 建模2.1 预备知识2.1.1 ADF检验结果&#xff08;单位根检验统计量&#xff09;2.1.2 差分序列的白噪声检验&#xff08;这里使用Ljung-Box检验&#xff09;2.1.3 ARIMA模型&#xff08;差分整合移动平均自回归模型&#xff09;的三个参数:p&#xff0c;…

《系统分析与设计》实验-----需求规格说明书 哈尔滨理工大学

文章目录 需求规格说明书1&#xff0e;引言1.1编写目的1.2项目背景1.3定义1.4参考资料 2&#xff0e;任务概述2.1目标2.2运行环境2.3条件与限制 3&#xff0e;数据描述3.1静态数据3.2动态数据3.3数据库介绍3.4数据词典3.5数据采集 4&#xff0e;功能需求4.1功能划分4.2功能描述…

(一)C++自制植物大战僵尸集成开发环境安装

植物大战僵尸游戏开发教程专栏地址http://t.csdnimg.cn/uzrnw 1、下载Visual Studio集成开发环境 首先在微软官网下载Visual Studio 2022 Community版本。Community版本是免费的&#xff0c;并且满足个人开发的各种需求。Visual Studio 2022 下载链接&#xff1a;微软官网。选…

springboot+vue全栈开发【2.前端准备工作篇】

目录 前言准备工作Vue框架介绍MVVM模式 快速入门导入vue在vscode创建一个页面 前言 hi&#xff0c;这个系列是我自学开发的笔记&#xff0c;适合具有一定编程基础&#xff08;html、css那些基础知识要会&#xff01;&#xff09;的同学&#xff0c;有问题及时指正&#xff01;…

在Windows上配置VS Code GO语言开发环境

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

【代码随想录】【动态规划】完全背包:零钱兑换,组合总和

零钱兑换 零钱作为物品 &#xff0c;零钱的面额作为物品的重量 def change(self, amount, coins):""":type amount: int:type coins: List[int]:rtype: int"""dp [0]*(amount 1)dp[0] 1# 遍历物品for i in range(len(coins)):# 遍历背包for …

室内设计师怎么获取合适的3D模型?

在室内设计中&#xff0c;3D模型的使用已经变得越来越普遍。它们可以帮助设计师更好地展示他们的设计想法&#xff0c;同时也能帮助客户更好地理解他们所期待的装修效果。然而&#xff0c;如何获取合适的3D模型却是许多设计师和客户面临的挑战。那么室内设计师怎么获取合适的3D…

watchdog,监控文件变化的强大的python库

大家好&#xff0c;今天为大家分享一个无敌的 Python 库 - watchdog。 Github地址&#xff1a;github.com/gorakhargos… 在软件开发和系统管理领域&#xff0c;经常需要监控文件和目录的变化&#xff0c;以便在文件被创建、修改或删除时触发相应的操作。Python Watchdog是一…

有图片转成PDF文件格式的方法吗?分享图片转成PDF文件的方法

将图片转换为PDF文件是一个相对简单的过程&#xff0c;但也需要一定的步骤和注意事项。下面&#xff0c;我将详细介绍如何将图片转换为PDF文件&#xff0c;包括所需的工具、步骤以及可能遇到的问题和解决方案。 首先&#xff0c;我们需要一个能够将图片转换为PDF文件的工具。市…

【Booksim】Booksim2.0模拟器集成新拓扑

Incorporating a new topology in Booksim 1. 新拓扑结构2. 需要添加的文件3. 修改步骤 3.1 添加testnet.hpp3.2 添加testnet.cpp3.3 将testnet集成到network.cpp中3.4 创建配置文件testnetconfig3.5 在main.cpp和global.hpp中加入gP_testnet和gA_testnet变量3.6 make进行编译 …

尚小标-智能AI商标注册交易平台【24小时您口袋里的商标管家】

随着全球经济一体化进程的推进和科技的飞速发展&#xff0c;知识产权已经成为企业高质量发展的重要竞争关键因素&#xff0c;众多企业发展的核心竞争力。通过加强知识产权保护&#xff0c;企业可以更好地保护自身品牌形象和市场份额&#xff0c;从而提高国内外市场竞争力&#…

C语言洛谷题目分享(9)奇怪的电梯

目录 1.前言 2.题目&#xff1a;奇怪的电梯 1.题目描述 2.输入格式 3.输出格式 4.输入输出样例 5.说明 6.题解 3.小结 1.前言 哈喽大家好啊&#xff0c;前一段时间小编去备战蓝桥杯所以博客的更新就暂停了几天&#xff0c;今天继续为大家带来题解分享&#xff0c;希望大…

通用设计的四大原则,大厂设计师带案例讲解!

作为数字产品设计师&#xff0c;在进行产品设计时要考虑产品的各种因素&#xff0c;例如功能、美观、安全等&#xff0c;要尽可能地满足所有用户的需求&#xff0c;做出对所有用户都尽可能公平的解决方案。但是&#xff0c;对于新手来说&#xff0c;在实际进行产品设计时&#…

HUD抬头显示器中如何设计LCD的阳光倒灌实验

关键词&#xff1a;阳光倒灌实验、HUD光照温升测试、LCD光照温升测试、太阳光模拟器 HUD&#xff08;Head-Up Display&#xff0c;即抬头显示器&#xff09;是一种将信息直接投影到驾驶员视线中的技术&#xff0c;通常用于飞机、汽车等驾驶舱内。HUD系统中的LCD&#xff08;Liq…

RabbbitMQ基本使用及其五种工作模型

初识MQ 同步通讯和异步通讯 什么是同步通讯呢&#xff1f;举个例子&#xff0c;你认识了一个小姐姐&#xff0c;聊的很火热&#xff0c;于是你们慢慢开始打电话&#xff0c;视频聊天&#xff0c;这种方式就成为同步通讯&#xff0c;那什么是一部通讯呢&#xff0c;同样的&…

Ant Design 表单基础用法综合示例

Ant Design 的表单组件设计得非常出色,极大地简化了表单开发的复杂度,让开发者能够快速构建出功能丰富、交互友好的表单界面。 接下来总结一下 Ant Design 中表单的基本用法。 Form 组件 用于定义整个表单,可以设置表单的布局方式、提交行为等。通常会将表单字段组件嵌套在 F…

利用栈删除数组中重复元素

先将数据排序&#xff08;降序或升序&#xff09; 建立一个“栈”&#xff0c;三种情况&#xff1a; 1.栈为空&#xff1a;压入一个元素 2.栈不为空 且 栈顶元素不等于将入栈元素&#xff1a;压入一个元素 3.栈不为空 且 栈顶元素等于将入栈元素&#xff1a;删除将压入元素…