Springboot Mybatis多数据源配置MybatisProperties坑

 一、场景复现

配置了两个数据源,查询Dao却报错表不存在。

(1)maven

<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>

(2)配置文件

spring:application:name: multi-datasourceprofiles:active: devdatasource:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/base?autoReconnect=true&zeroDateTimeBehavior=convertToNull&characterEncoding=UTF-8username: rootpassword: admin
mybatis:mapper-locations: classpath*:mapper/base/*.xmltype-aliases-package: com.mk.mybatis.multidatasourceconfiguration:map-underscore-to-camel-case: truesys:one-mybatis:datasource:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/man?autoReconnect=true&zeroDateTimeBehavior=convertToNull&characterEncoding=UTF-8username: rootpassword: admin

(3)配置代码

base数据源

@Configuration
@MapperScan(value = "com.mk.mybatis.multidatasource.base.dao", sqlSessionTemplateRef = "baseSqlSessionTemplate")
public class BaseMybatisConfig {@Primary@Bean@ConfigurationProperties(prefix = "spring.datasource")public DataSourceProperties baseDataSourceProperties() {return new DataSourceProperties();}@Primary@Bean("datasource")public DataSource baseDataSource(@Qualifier("baseDataSourceProperties") DataSourceProperties dataSourceProperties) {DataSource dataSource = dataSourceProperties.initializeDataSourceBuilder().build();return dataSource;}@Primary@Beanpublic SqlSessionFactory baseSqlSessionFactory(@Qualifier("datasource") DataSource dataSource, MybatisProperties mybatisProperties) throws Exception {SqlSessionFactoryBean bean = new SqlSessionFactoryBean();bean.setDataSource(dataSource);bean.setMapperLocations(mybatisProperties.resolveMapperLocations());bean.setTypeAliasesPackage(mybatisProperties.getTypeAliasesPackage());bean.setConfigurationProperties(mybatisProperties.getConfigurationProperties());bean.setConfiguration(mybatisProperties.getConfiguration());bean.setConfigLocation(Optional.ofNullable(mybatisProperties.getConfigLocation()).map(location -> {try {ResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver();return resourceResolver.getResource(location);} catch (Exception var3) {return null;}}).orElse(null));return bean.getObject();}@Primary@Beanpublic DataSourceTransactionManager transactionManager(@Qualifier("datasource") DataSource dataSource) {return new DataSourceTransactionManager(dataSource);}@Primary@Beanpublic SqlSessionTemplate baseSqlSessionTemplate(@Qualifier("baseSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {return new SqlSessionTemplate(sqlSessionFactory);}

one数据源

@Configuration
@MapperScan(value = "com.mk.mybatis.multidatasource.one.dao", sqlSessionTemplateRef = "oneSqlSessionTemplate")
@Slf4j
public class OneMybatisConfig {@Bean@ConfigurationProperties(prefix = "sys.one-mybatis.datasource")public DataSourceProperties oneDataSourceProperties() {return new DataSourceProperties();}@Beanpublic DataSource oneDataSource(@Qualifier("oneDataSourceProperties") DataSourceProperties dataSourceProperties) {DataSource dataSource = dataSourceProperties.initializeDataSourceBuilder().build();return dataSource;}@Beanpublic SqlSessionFactory oneSqlSessionFactory(@Qualifier("oneDataSource") DataSource dataSource, MybatisProperties mybatisProperties)throws Exception{SqlSessionFactoryBean bean = new SqlSessionFactoryBean();bean.setDataSource(dataSource);bean.setMapperLocations(mybatisProperties.resolveMapperLocations());bean.setTypeAliasesPackage(mybatisProperties.getTypeAliasesPackage());bean.setConfigurationProperties(mybatisProperties.getConfigurationProperties());bean.setConfiguration(mybatisProperties.getConfiguration());bean.setConfigLocation(Optional.ofNullable(mybatisProperties.getConfigLocation()).map(location->{try {ResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver();return resourceResolver.getResource(location);} catch (Exception var3) {return null;}}).orElse(null));return bean.getObject();}@Beanpublic DataSourceTransactionManager oneTransactionManager(@Qualifier("oneDataSource") DataSource dataSource) {return new DataSourceTransactionManager(dataSource);}@Beanpublic SqlSessionTemplate oneSqlSessionTemplate(@Qualifier("oneSqlSessionFactory") SqlSessionFactory sqlSessionFactory){return new SqlSessionTemplate(sqlSessionFactory);}
}

 (4)SqlSessionFactory debug到的数据源是正确的

(5)两个数据源扫描的dao最后关联的数据都是one数据源

 

二、分析原因

以前遇到过是数据源@Resource生成bean顺序乱造成注入数据源地址错误。现在这种情况数据源没有注入错误,sqlSessionFactory也没有错,结果生成Dao关联到的数据源却是错的,百思不得其解。

经过后期的比对,发现两个SqlSessionFactory共用一个MybatisProperties,配置多一个MybatisProperties就没有出现这个问题了。

原因是共用了mybatisProperties.getConfiguration()对象,造成数据源都是最后初始化的数据源。

 

三、解决方案

定义oneMybatisProperties,注入自己的MybatisProperties,结果共用问题

    @Bean@ConfigurationProperties(prefix = "sys.one-mybatis.mybatis")public MybatisProperties oneMybatisProperties(){return new MybatisProperties();}@Beanpublic SqlSessionFactory oneSqlSessionFactory(@Qualifier("oneDataSource") DataSource dataSource,@Qualifier("oneMybatisProperties") MybatisProperties mybatisProperties)throws Exception{SqlSessionFactoryBean bean = new SqlSessionFactoryBean();bean.setDataSource(dataSource);bean.setMapperLocations(mybatisProperties.resolveMapperLocations());bean.setTypeAliasesPackage(mybatisProperties.getTypeAliasesPackage());bean.setConfigurationProperties(mybatisProperties.getConfigurationProperties());bean.setConfiguration(mybatisProperties.getConfiguration());bean.setConfigLocation(Optional.ofNullable(mybatisProperties.getConfigLocation()).map(location->{try {ResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver();return resourceResolver.getResource(location);} catch (Exception var3) {return null;}}).orElse(null));return bean.getObject();}

 

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

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

相关文章

dotnet core webapi +vue 搭建前后端完全分离web架构(一)

架构服务端采用 dotnet core webapi前端采用: Vue router elementUIaxios问题使用前后端完全分离的架构&#xff0c;首先遇到的问题肯定是跨域访问。前后端可能不在同个server上&#xff0c;即使前后端处在同个server上&#xff0c;由于前后端完全分离&#xff0c;前后端使用…

SpringBoot使用日志

转载自 SpringBoot使用日志 1、选什么日志框架 首先列举一下日志门面和实现SpringBoot默认选用SLF4J和Logback日志级别&#xff1a;springboot默认已经帮我们配置好了日志&#xff0c;日志级别为trace<debug<info<warn<error默认的日志级别为inifo&#xff0c;日…

Dotnet Core Windows Service

在dotnet 中有topshelf 可以很方便的写windows 服务并且安装也是很方便的&#xff0c;命令行 运行.exe install 就直接把exe 程序安装成windows 服务。当然代码也要做相应的修改&#xff0c;具体的可以参照例子。在dotnet core 2.0 中 我们也有一个很方便的dll 来使用 https://…

Dubbo(十)之配置加载流程

转载自 Dubbo配置加载流程 Dubbo 中的配置加载流程介绍 此篇文档主要讲在应用启动阶段&#xff0c;Dubbo框架如何将所需要的配置采集起来&#xff08;包括应用配置、注册中心配置、服务配置等&#xff09;&#xff0c;以完成服务的暴露和引用流程。 根据驱动方式的不同&…

.NET 文档数据库 RavenDB 4.0 发布

RavenDB 还有一个新的版本&#xff0c;RavenDB 4.0.0&#xff0c;一个ACID文档数据库&#xff0c;为数据操作中的高性能业务提供完全事务性的开源NoSQL解决方案。新版本更新了许多关键功能。平台Windows x64Windows x86Ubuntu 16.04 x64树莓派Docker&#xff08;Ubuntu 16.04和…

dotnetcore+vue+elementUI 前后端分离架 二(后端篇)

前言最近几年前后端分离架构大行其道&#xff0c;而且各种框架也是层出不穷。本文通过dotnetcore vue 来介绍 前后端分离架构实战。涉及的技术栈服务端技术mysql本项目使用mysql 作为持久化层本项目采用了 mysql 的示例 employees 数据库, 需要的朋友可以自行下载 。http://www…

SpringCloud Gateway配置自定义路由404坑

一、场景复现 微服务自定义路由&#xff0c;返回404页面。 ①如图&#xff1a; &#xff08;1&#xff09;springcloud-gateway的路由设置 Configuration public class RouteConfig {Beanpublic RouteLocator customRouteLocator(RouteLocatorBuilder builder) {return buil…

Actor-ES框架:Ray-Handler之ToReadHandler编写

如图右上角所示&#xff0c;Ray中有两类Handler&#xff08;SubHandler和PartSubHandler&#xff09;,在使用中&#xff0c;SubHandler派生Actor的CoreHandler&#xff0c;PartSubHandler派生SQLToReadHandler&#xff0c;SQLToReadHandler派生Actor的ToReadHandler&#xff0c…

SpringCloud Zuul(十)之配置路由prefix坑

一、场景复现 配置prefixapi访问/api/micro-service/test接口404 &#xff08;1&#xff09;zuul配置 zuul:strip-prefix: true #转发路径截断匹配前缀prefix: "api"add-proxy-headers: falseset-content-length: truesemaphore:max-semaphores: 600 &#xff08;…

在Firefox 58中,WebAssembly组件性能提升了10倍

Mozilla在Firefox 58中为WebAssembly&#xff08;WASM&#xff09;组件推出了一套双层编译系统&#xff0c;号称解析和编译WASM代码的速度达到30-60MB/s&#xff0c;足够在有线网络中实现实时编译。基准测试表明&#xff0c;新版的性能比旧版提高了10倍&#xff0c;比Chrome快1…

SpringCloud Zuul(九)之路由自动刷新原理

一、现象 发布新服务&#xff0c;然后在数据库配置了路由&#xff0c;使用服务路径访问404。然后重新发布新的服务&#xff0c;就可以继续访问得到 &#xff08;1&#xff09;配置了路由第一次访问 &#xff08;2&#xff09;重新发布后访问 二、分析 &#xff08;1&#xf…

dotnetcore+vue+elementUI 前后端分离 三(前端篇)

说明&#xff1a;本项目使用了 mysql employees数据库&#xff0c;使用了vue axois element UI 2.0 ,演示了 单页程序 架构 ,vue router 的使用&#xff0c;axois 使用&#xff0c;以及 element UI 控件的使用。通过这几种技术的组合&#xff0c;实现了对 employee 的增&…

SpringCloud Greenwich(一)注册中心之nacos、Zuul和 gateway网关配置

本项目是搭建基于nacos注册中心的springcloud&#xff0c;使用zuul网关和gateway网关。 一、框架搭建 &#xff08;1&#xff09;项目结构 micro-service 服务提供者 zuul-gateway zuul网关 springcloud-gateway gateway网关 &#xff08;2&#xff09;环境 nacos 1.4.1…

欢乐ssl暑假赛【2019.8.6】

前言 莫得前言 成绩 JJJ表示初中&#xff0c;HHH表示高中后面加的是几年级&#xff0c;只放前10 RankRankRankPersonPersonPersonScoreScoreScoreAAABBBCCCDDDEEE111(J−3)WYC(J-3)WYC(J−3)WYC500500500100100100100100100100100100100100100100100100222(H−1)QYH(H-1)QYH(H…

Actor-ES框架:Ray-Handler-消息订阅器编写

消息订阅器&#xff1a;Ray是基于Event Sourcing设计的ES/Actor框架&#xff0c;消息发布后需要订阅处理&#xff0c;订阅器主要有以下两类&#xff1a;CoreHandler消息订阅器RabbitSubSubHandlerToReadHandler消息订阅器RabbitSubSQLToReadHandler&#xff08;ToReadHandler的…

Actor-ES框架:Actor编写-ESGrain与ESRepGrain

ESGrain生命周期Ray中ESGrain继承自Grain扩展了Grain的生命周期。Grain的生命周期参加文档附录&#xff1a;1-Grain生命周期-译注.mdESGrain重写了Grain的OnActivateAsync方法。ESGrain的初始化过程如下&#xff1a;初始化ESGrain中的State调用ReadSnapshotAsync()读快照。如果…

DotNetAnywhere:可供选择的 .NET 运行时

我最近在收听一个名为DotNetRock 的优质播客&#xff0c;其中有以Knockout.js而闻名的Steven Sanderson 正在讨论 " WebAssembly And Blazor "。也许你还没听过&#xff0c;Blazor 正试图凭借WebAssembly的魔力将 .NET 带入到浏览器中。如果您想了解更多信息&#xf…

SpringCloud Greenwich(二)注册中心之consul、Zuul和 gateway网关配置

本项目是搭建基于consul注册中心的springcloud&#xff0c;使用zuul网关和gateway网关 一、框架搭建 &#xff08;1&#xff09;项目结构 micro-service 服务提供者 zuul-gateway zuul网关 springcloud-gateway gateway网关 &#xff08;2&#xff09;环境 consul 1.9.0…

Actor-ES框架:消息发布器与消息存储器

消息发布器&#xff1a;Ray是基于Event Sourcing设计的ES/Actor框架&#xff0c;ESGrain状态&#xff08;State&#xff09;的修改、ESGrain之间的通信默认使用RabbitMQ通信。消息的发布器主要是RabbitPubESGrain。RabbitPub特性RabbitPub特性是RabbitMQ消息发布器。RabbitSub特…

consul的安装搭建

一、下载consul consul官网下载地址&#xff1a;https://www.consul.io/downloads 旧版本下载 consul 1.9.3直接下载地址&#xff1a; consul_1.9.3_windows_amd64.zip consul_1.9.3_linux_amd64.zip 二、安装 将consul_1.9.3_xxx.zip解压的xxx/consul目录 &#xff08;1&…