主数据源(由于代码没有办法复制的原因,下面图片和文字不一致)


package com.zhianchen.mysqlremark.toword.config;

import com.zaxxer.hikari.HikariDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;


/**
* @program: test
* @description:
* @author: chenzhian
* @create: 2021-10-13 20:31:54
* @version: 1.0
**/
@Configuration
// 扫描 Mapper 接口并容器管理
// @MapperScan(basePackages = MasterDataSourceConfig.PACKAGE, sqlSessionFactoryRef = "masterSqlSessionFactory")
public class MasterDataSourceConfig {


// 精确到 master 目录,以便跟其他数据源隔离
static final String PACKAGE = "com.zhianchen.mysqlremark.toword.dao";
static final String MAPPER_LOCATION = "classpath:mapping/master/*.xml";

@Primary
@Bean(name = "masterDataSource")
@ConfigurationProperties("spring.master.datasource")
public DataSource masterDataSource() {
return new HikariDataSource();
}

@Primary
@Bean(name = "masterTransactionManager")
public DataSourceTransactionManager masterTransactionManager() {
return new DataSourceTransactionManager(masterDataSource());
}

@Primary
@Bean(name = "masterSqlSessionFactory")
public SqlSessionFactory masterSqlSessionFactory(@Qualifier("masterDataSource") DataSource masterDataSource)
throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(masterDataSource);
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources(MasterDataSourceConfig.MAPPER_LOCATION));
return sessionFactory.getObject();
}

/* 可以另外手动指定目录 */
@Bean(name="masterMapperScannerConfigurer")
public MapperScannerConfigurer masterMapperScannerConfigurer(){
MapperScannerConfigurer configurer = new MapperScannerConfigurer();
configurer.setSqlSessionFactoryBeanName("masterSqlSessionFactory");
configurer.setBasePackage(PACKAGE);
return configurer;
}

}

第二个数据源(由于代码没有办法复制的原因,下面图片和文字不一致)

package com.zhianchen.mysqlremark.toword.config;

import com.zaxxer.hikari.HikariDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;


/**
* @program: test
* @description:
* @author: chenzhian
* @create: 2021-10-13 20:31:54
* @version: 1.0
**/
@Configuration
// 扫描 Mapper 接口并容器管理
// @MapperScan(basePackages = secondDataSourceConfig.PACKAGE, sqlSessionFactoryRef = "secondSqlSessionFactory")
public class SecondDataSourceConfig {


// 精确到 second 目录,以便跟其他数据源隔离
static final String PACKAGE = "com.zhianchen.mysqlremark.toword.seconddao";
static final String MAPPER_LOCATION = "classpath:mapping/second/*.xml";



@Bean(name = "secondDataSource")
@ConfigurationProperties("spring.second.datasource")
public DataSource secondDataSource() {
return new HikariDataSource();
}

@Bean(name = "secondTransactionManager")
public DataSourceTransactionManager secondTransactionManager() {
return new DataSourceTransactionManager(secondDataSource());
}

@Bean(name = "secondSqlSessionFactory")
public SqlSessionFactory secondSqlSessionFactory(@Qualifier("secondDataSource") DataSource secondDataSource)
throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(secondDataSource);
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources(SecondDataSourceConfig.MAPPER_LOCATION));
return sessionFactory.getObject();
}

/* 可以另外手动指定目录 */
@Bean(name="secondMapperScannerConfigurer")
public MapperScannerConfigurer crwalerMapperScannerConfigurer(){
MapperScannerConfigurer configurer = new MapperScannerConfigurer();
configurer.setSqlSessionFactoryBeanName("secondSqlSessionFactory");
configurer.setBasePackage(PACKAGE);
return configurer;
}


}

application.yml的配置

# master 数据源配置
master:
datasource:
url: jdbc:mysql://localhost:33306/mastertest?serverTimezone=GMT&useUnicode=true&characterEncoding=utf8
driver-class-name: com.mysql.cj.jdbc.Driver
username: sa
password: sa!@123
type: com.zaxxer.hikari.HikariDataSource
minimum-idle: 5 #最小空闲连接数量
maximum-pool-size: 50 #连接池中最大连接数
max-lifetime: 180000 #连接最长生命周期,当连接存活时间达到30分钟之后会被关闭作退休处理
idle-timeout: 30000 # 连接允许最长空闲时间,如果连接空闲时间超过1分钟,则会被关闭
connection-timeout: 30000 客户端创建连接等待超时时间,如果30秒内没有获取连接则抛异常,不再继续等待 # second 数据源配置
second:
datasource:
url: jdbc:mysql://localhost:33306/sencondtest?serverTimezone=GMT&useUnicode=true&characterEncoding=utf8
username: root
password: 1q2w#E4r
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.zaxxer.hikari.HikariDataSource
minimum-idle: 5 #最小空闲连接数量
maximum-pool-size: 50 #连接池中最大连接数
max-lifetime: 180000 #连接最长生命周期,当连接存活时间达到30分钟之后会被关闭作退休处理
idle-timeout: 30000 # 连接允许最长空闲时间,如果连接空闲时间超过1分钟,则会被关闭
connection-timeout: 30000 客户端创建连接等待超时时间,如果30秒内没有获取连接则抛异常,不再继续等待

更多Hikari的配置请看最后的来源

Hikari是SpringBoot2.0以后默认使用的数据库连接池,如果是老的话可能会使用到Druid 用来做数据库连接池,下面是对两个的了解介绍

SpringBoot基础篇(二)连接池hikari和druid

HiKariCP和Druid对比使用整理自测

mybatis 配置 多个数据源 org.apache.ibatis.binding.BindingException Vakud bound statement (not found)

原因是没有配置@MapperScan ,因为我这里是多个目录,所以也要配置多个,在Application的启动上面加

@MapperScan(value{"com.xxxx","com.aaaa"})

如果上面有用到MapperScannerConfigurer 就不需要这个了。

The bean 'xxxService' could not be injected as a 'com.xxxxImpl' because it is a JDK dynamic proxy that implements:
com.xxxxService

Action:

Consider injecting the bean as one of its interfaces or forcing the use of CGLib-based proxies by setting proxyTargetClass=true on @EnableAsync and/or @EnableCaching.

原因居然是因为用到是@Resouce 来直接调用ServiceImpl,造成程序加载的时候还没有Service的Impl实现类,让程序加载的时候找不到这个类

解决方案

改成调用Service 接口,另外把@Resouce 改成 @Autowired 就可以了。

资料整理来源

SpringBoot和Mybatis配置多数据源连接多个数据库

数据库连接池之Hikari源码解析

package com.zhianchen.mysqlremark.toword.config;

import com.zaxxer.hikari.HikariDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;


/**
* @program: test
* @description:
* @author: chenzhian
* @create: 2021-10-13 20:31:54
* @version: 1.0
**/
@Configuration
// 扫描 Mapper 接口并容器管理
// @MapperScan(basePackages = MasterDataSourceConfig.PACKAGE, sqlSessionFactoryRef = "masterSqlSessionFactory")
public class MasterDataSourceConfig {


// 精确到 master 目录,以便跟其他数据源隔离
static final String PACKAGE = "com.zhianchen.mysqlremark.toword.dao";
static final String MAPPER_LOCATION = "classpath:mapping/master/*.xml";

@Primary
@Bean(name = "masterDataSource")
@ConfigurationProperties("spring.master-datasource")
public DataSource masterDataSource() {
return new HikariDataSource();
}

@Primary
@Bean(name = "masterTransactionManager")
public DataSourceTransactionManager masterTransactionManager() {
return new DataSourceTransactionManager(masterDataSource());
}

@Primary
@Bean(name = "masterSqlSessionFactory")
public SqlSessionFactory masterSqlSessionFactory(@Qualifier("masterDataSource") DataSource masterDataSource)
throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(masterDataSource);
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources(MasterDataSourceConfig.MAPPER_LOCATION));
return sessionFactory.getObject();
}

/* 可以另外手动指定目录 */
@Bean(name="masterMapperScannerConfigurer")
public MapperScannerConfigurer masterMapperScannerConfigurer(){
MapperScannerConfigurer configurer = new MapperScannerConfigurer();
configurer.setSqlSessionFactoryBeanName("masterSqlSessionFactory");
configurer.setBasePackage(PACKAGE);
return configurer;
}

}

springboot和mybatis 配置多数据源的更多相关文章

  1. SpringBoot集成Mybatis配置动态数据源

    很多人在项目里边都会用到多个数据源,下面记录一次SpringBoot集成Mybatis配置多数据源的过程. pom.xml <?xml version="1.0" encod ...

  2. springboot入门系列(四):SpringBoot和Mybatis配置多数据源连接多个数据库

    SpringBoot和Mybatis配置多数据源连接多个数据库 目前业界操作数据库的框架一般是 Mybatis,但在很多业务场景下,我们需要在一个工程里配置多个数据源来实现业务逻辑.在SpringBo ...

  3. SpringBoot整合MyBatisPlus配置动态数据源

    目录 SpringBoot整合MyBatisPlus配置动态数据源 SpringBoot整合MyBatisPlus配置动态数据源 推文:2018开源中国最受欢迎的中国软件MyBatis-Plus My ...

  4. Spring Boot + Mybatis 配置多数据源

    Spring Boot + Mybatis 配置多数据源 Mybatis拦截器,字段名大写转小写 package com.sgcc.tysj.s.common.mybatis; import java ...

  5. spring+myBatis 配置多数据源,切换数据源

    注:本文来源于  tianzhiwuqis <spring+myBatis 配置多数据源,切换数据源> 一个项目里一般情况下只会使用到一个数据库,但有的需求是要显示其他数据库的内容,像这样 ...

  6. SpringBoot+MyBatis配置多数据源

    SpringBoot 可以支持多数据源,这是一个非常值得学习的功能,但是从现在主流的微服务的架构模式中,每个应用都具有唯一且准确的功能,多数据源的需求很难用到,考虑到实际情况远远比理论复杂的多,这里还 ...

  7. springboot + mybatis配置多数据源示例

    转:http://www.jb51.net/article/107223.htm 在实际开发中,我们一个项目可能会用到多个数据库,通常一个数据库对应一个数据源. 代码结构: 简要原理: 1)Datab ...

  8. SpringBoot集成mybatis配置

    一个有趣的现象:传统企业大都喜欢使用hibernate,互联网行业通常使用mybatis:之所以出现这个问题感觉与对应的业务有关,比方说,互联网的业务更加的复杂,更加需要进行灵活性的处理,所以myba ...

  9. springboot整合mybatis的多数据源解决办法

    最近项目有一个非解决不可的问题,我们的项目中的用户表是用的自己库的数据,但是这些数据都是从一个已有库中迁过来的,所以用户信息都是在那个项目里面维护,自然而然我们项目不提供用户注册功能,这就有个问题,如 ...

随机推荐

  1. 【MyBatis】多关键字的模糊查询

    目录 情景分析 题目 要求 相关代码 Mapper.java Impl.java mapper.xml test.java 思路分析 1.最开始,参数没有使用List,引起的问题 2.Mybatis的 ...

  2. [笔记] prufer 序列

    什么是 prufer 序列 是可以和 \(n\) 个有标号节点的无根树一一对应的长度为 \(n-2\) 的序列. 一般来说是用于和树相关的组合计数问题,但是可能会出现一些变形,所以除了要了解一些性质, ...

  3. 【Istio实际操作篇】Istio入门,10分钟快速安装

    @ 目录 前言 本文说明 请大家务必查看 环境准备 详细版 入门:搭建步骤 Istio软件包下载 下载Istio 卸载 简洁版 安装 卸载 学习不走弯路,gz号「yeTechLog」 前言 上一篇讲了 ...

  4. MySQL实时在线备份恢复方案

    开源Linux 长按二维码加关注~ 上一篇:2020年MySQL数据库面试题总结 快照和复制技术的结合可以保证我们得到一个实时的在线MySQL备份解决方案. 当主库发生误操作时,只需要恢复备库上的快照 ...

  5. '@JvmDefault' is only supported since JVM target 1.8. Recompile with '-jvm-ta

    Java 1.8加入了接口默认实现的方式. 那么在kotlin中如何使用呢? 可以在方法上加注解@JvmDefault 但直接加上后会编译会碰到一些错误提示.下面是解决方法. 问题 Logcat 提示 ...

  6. ElasticSearch7.3学习(二十二)----Text字段排序、Scroll分批查询场景解析

    1.Text字段排序 场景:数据库中按照某个字段排序,sql只需写order by 字段名即可,如果es对一个text field进行排序,es中无法排序.因为文档入倒排索引表时,分词存入,es无法知 ...

  7. java框架--快速入门

    spring快速入门    1.创建项目        1.1创建项目文件夹        1.2启动idea ->文件->打开->点击创建的项目文件夹        1.3右键创建 ...

  8. 使用argparse进行调参

    argparse是深度学习项目调参时常用的python标准库,使用argparse后,我们在命令行输入的参数就可以以这种形式python filename.py --lr 1e-4 --batch_s ...

  9. 面试官:Netty心跳检测机制是什么,怎么自定义检测间隔时间?

    哈喽!大家好,我是小奇,一位热爱分享的程序员 小奇打算以轻松幽默的对话方式来分享一些技术,如果你觉得通过小奇的文章学到了东西,那就给小奇一个赞吧 文章持续更新 一.前言 书接上回,昨天在地里干了一天的 ...

  10. nginx 代理请求导出功能bug解决方法

    问题描述: nginx代理的ip直接访问可以直接下载文件,但是通过nginx访问就报502,nginx错误日志:upstream sent invalid chunked response while ...