使用springboot+druid双数据源动态配置操作

网友投稿 1134 2022-12-10

使用springboot+druid双数据源动态配置操作

使用springboot+druid双数据源动态配置操作

目录一、yml配置二、动态切换数据源配置文件1.数据源db12.数据源db2三、多数据源的mapper包最好是分开四、代码中调用总结

进行动态切换,需要在类里面配置,顺便解决mybatis-plus自带代码无法使用问题,直接上代码:

一、yml配置

数据源可以都是oracle的也可以一个是oracle一个是mysql的。

spring:

datasource:

druid:

db-type: com.alibaba.druid.pool.DruidDataSource

#多数据源1:

zjdb:

driverClassName: oracle.jdbc.driver.OracleDriver

url: jdbc:oracle:thin:@XX.XX.XX.XX:1521/ORCL

username: XXXXXXX

password: XXX

# \u521D\u59CB\u5316\u8FDE\u63A5\u5927\u5C0F

initial-size: 5

# \u6700\u5C0F\u7A7A\u95F2\u8FDE\u63A5\u6570

min-idle: 5

max-active: 20

max-wait: 30000

# \u53EF\u5173\u95ED\u7684\u7A7A\u95F2\u8FDE\u63A5\u95F4\u9694\u65F6\u95F4

time-between-eviction-runs-millis: 60000

# \u914D\u7F6E\u8FDE\u63A5\u5728\u6C60\u4E2D\u7684\u6700\u5C0F\u751F\u5B58\u65F6\u95F4

min-evictable-idle-time-millis: 300000

validation-query: select '1' from dual

test-while-idle: true

test-on-borrow: false

test-on-return: false

# \u6253\u5F00PSCache\uFF0C\u5E76\u4E14\u6307\u5B9A\u6BCF\u4E2A\u8FDE\u63A5\u4E0APSCache\u7684\u5927\u5C0F

pool-prepared-statements: true

max-open-prepared-statements: 20

max-pool-prepared-statement-per-connection-size: 20

# \u914D\u7F6E\u76D1\u63A7\u7EDF\u8BA1\u62E6\u622A\u7684filters

filters: stat

#多数据源2:

zjfz:

driverClassName: oracle.jdbc.driver.OracleDriver

url: jdbc:oracle:thin:@XX.XX.XX.XX:51521/ORCL

username: XXXXX

password: XXXX

# driverClassName: com.mysql.jdbc.Driver

# url: jdbc:mysql://127.0.0.1:3306/ketech-dev?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&allowPublicKeyRetrieval=true

# username: root

# password: 123456

# \u521D\u59CB\u5316\u8FDE\u63A5\u5927\u5C0F

initial-size: 5

# \u6700\u5C0F\u7A7A\u95F2\u8FDE\u63A5\u6570

min-idle: 5

max-active: 20

max-wait: 30000

# \u53EF\u5173\u95ED\u7684\u7A7A\u95F2\u8FDE\u63A5\u95F4\u9694\u65F6\u95F4

time-between-eviction-runs-millis: 60000

# \u914D\u7F6E\u8FDE\u63A5\u5728\u6C60\u4E2D\u7684\u6700\u5C0F\u751F\u5B58\u65F6\u95F4

min-evictable-idle-time-millis: 300000

validation-query: select '1' from dual

test-while-idle: true

test-on-borrow: false

test-on-return: false

# http://u6253\u5F00PSCache\uFF0C\u5E76\u4E14\u6307\u5B9A\u6BCF\u4E2A\u8FDE\u63A5\u4E0APSCache\u7684\u5927\u5C0F

pool-prepared-statements: true

max-open-prepared-statements: 20

max-pool-prepared-statement-per-connection-size: 20

# \u914D\u7F6E\u76D1\u63A7\u7EDF\u8BA1\u62E6\u622A\u7684filters

filters: stat

stat-view-servlet:

url-pattern: /druid/*

reset-enable: false

login-username: admin

login-password: 123456

web-stat-filter:

url-pattern: /*

exclusions: "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*"

二、动态切换数据源配置文件

1.数据源db1

package yin.ketech.app.config;

import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;

import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;

import org.apache.ibatis.session.SqlSessionFactory;

import org.mybatis.spring.SqlSessionTemplate;

import org.mybatis.spring.annotation.MapperScan;

import org.springframework.beans.factory.annotation.Qualifier;

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.core.io.support.ResourcePatternResolver;

import javax.sql.DataSource;

/**

* @FileName: ZjDbConfig

* @Author Yep

* @create 2020-06-17

* @Description: 多数据源-1

*/

@Configuration

@MapperScan(basePackages = "yin.ketech.app.mapper", sqlSessionFactoryRef = "zjdbSqlSessionFactory")

public class ZjDbConfig {

@Primary

@Bean(name = "zjdbDataSource")

@Qualifier("zjdbDataSource")

@ConfigurationProperties(prefix = "spring.datasource.zjdb")

public DataSource zjdbDataSource() {

return DruidDataSourceBuilder.create().build();

}

@Primary

@Bean(name = "zjdbSqlSessionFactory")

@Qualifier("zjdbSqlSessionFactory")

public SqlSessionFactory zjdbSqlSessionFactory(@Qualifier("zjdbDataSource") DataSource zjdbDataSource) throws Exception {

// SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();

// factoryBean.setDataSource(zjdbDataSource);

//解决无法使用自带方法问题

// TODO 使用 MybatisSqlSessionFactoryBean 而不是 SqlSessionFactoryBean

MybatisSqlSessionFactoryBean factory = new MybatisSqlSessionFactoryBean();

factory.setDataSource(zjdbDataSource);

//添加XML目录

ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();

try {

factory.setMapperLocations(resolver.getResources("classpath:/yin/ketech/app/mapper/*/*.xml"));

} catch (Exception e) {

e.printStackTrace();

throw new RuntimeException(e);

}

//解决无法使用分页问题

// factory.setPlugins(new Interceptor[]{new MybatisPlusConfig().paginationInterceptor()});

//设置Oracle主键自增

factory.setGlobalConfig(new MybatisPlusConfig().globalConfig());

return factory.getObject();

}

@Primary

@Bean(name = "zjdbSqlSessionTemplate")

public SqlSessionTemplate zjdbSqlSessionTemplate(@Qualifier("zjdbSqlSessionFactory") SqlSessionFactory zjdbSqlSessionFactory) throws Exception {

// 使用上面配置的Factory

SqlSessionTemplate template = new SqlSessionTemplate(zjdbSqlSessionFactory);

return template;

}

}

2.数据源db2

package yin.ketech.app.config;

import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;

import org.apache.ibatis.session.SqlSessionFactory;

import org.mybatis.spring.SqlSessionFactoryBean;

import org.mybatis.spring.SqlSessionTemplate;

import org.mybatis.spring.annotation.MapperScan;

import org.springframework.beans.factory.annotation.Qualifier;

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.core.io.support.ResourcePatternResolver;

import javax.sql.DataSource;

/**

* @FileName: ZjFzConfig

* @Author Yep

* @create 2020-06-17

* @Description: 多数据源-2

*/

@Configuration

@MapperScan(basePackages = "yin.ketech.app.zjfzmapper", sqlSessionFactoryRef = "zjfzSqlSessionFactory")

public class ZjFzConfig {

@Bean(name = "zjfzDataSource")

@Qualifier("zjfzDataSource")

@ConfigurationProperties(prefix = "spring.datasource.zjfz")

public DataSource zjfzDataSource() {

return DruidDataSourceBuilder.create().build();

}

@Bean(name = "zjfzSqlSessionFactory")

@Qualifier("zjfzSqlSessionFactory")

public SqlSessionFactory zjfzSqlSessionFactory(@Qualifier("zjfzDataSource") DataSource zjfzDataSource) throws Exception {

SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();

factoryBean.setDataSource(zjfzDataSource);

//添加XML目录

ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();

try {

factoryBean.setMapperLocations(resolver.getResources("classpath:/yin/ketech/app/mapper/zjfz/mapper/*.xml"));

http:// } catch (Exception e) {

e.printStackTrace();

throw new RuntimeException(e);

}

return factoryBean.getObject();

}

@Bean(name = "zjfzSqlSessionTemplate")

public SqlSessionTemplate zjfzSqlSessionTemplate(@Qualifier("zjfzSqlSessionFactory") SqlSessionFactory zjfzSqlSessionFactory) throws Exception {

// 使用上面配置的Factory

SqlSessionTemplate template = new SqlSessionTemplate(zjfzSqlSessionFactory);

return template;

}

}

三、多数据源的mapper包最好是分开

在扫描的时候会动态注入,可能在上述代码中会导致数据源自动切换失败:

四、代码中调用

总结

1. 注意动态配置的类结合自己的包项目结构修改

2. 解决了mybatis-plus自带语句不能使用问题

3. 解决无法使用分页问题

4. 解决无法使用oracle自增主键问题

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:springboot如何读取模板文件
下一篇:Jmeter如何获取jtl文件中所有的请求报文详解
相关文章

 发表评论

暂时没有评论,来抢沙发吧~