0
点赞
收藏
分享

微信扫一扫

java springboot mybatis 自主实现配置多数据源 mysql postgresql 和正式测试环境切换

AbrahamW 2022-08-02 阅读 42


目录

​​介绍​​

​​依赖​​

​​配置文件​​

​​配置类1​​

​​配置类二​​

介绍

  • 1.需要引入多款数据库的依赖驱动和mybatis
  • 2.写配置文件,做一个全局配置的是测试or 生产环境
  • 3.写配置类在配置类中通过 全局的测试生产判断调用哪个配置
  • static final String PACKAGE = "com.superman.globaldao.ds2";
  • static final String MAPPER_LOCATION = "classpath:mybatis/mapper/ds2/*.xml";
  • 在上边俩个配置的地址写dao  和xml  即可

 

依赖

<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.2.6</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>

 

配置文件

##--------------------多数据源配置---------------
#测试环境
ds.datasource.linktype=test
#正式环境
#ds.datasource.linktype=formal



##--------------------#datasource1配置--------------------------------
#开发环境
ds1.datasource.url0=jdbc:mysql://localhost:3306/porject?useUnicode=true&characterEncoding=utf-8
ds1.datasource.username0=xxx
ds1.datasource.password0=xxx

#生产环境
ds1.datasource.url1=jdbc:mysql://10.10.10.10:3306/porject?useUnicode=true&characterEncoding=utf-8
ds1.datasource.username1=xx
ds1.datasource.password1=xx

ds1.datasource.driverClassName=com.mysql.jdbc.Driver

ds1.datasource.initialSize=20
ds1.datasource.minIdle=20
ds1.datasource.maxActive=100
ds1.datasource.maxWait=60000
ds1.datasource.timeBetweenEvictionRunsMillis=60000
ds1.datasource.minEvictableIdleTimeMillis=300000
ds1.datasource.testWhileIdle=true
ds1.datasource.testOnBorrow=false
ds1.datasource.testOnReturn=false
ds1.datasource.poolPreparedStatements=true
ds1.datasource.maxPoolPreparedStatementPerConnectionSize=20



##--------------------#datasource21配置--------------------------------
#数据库表结构在/resources/describe/logandapitableinfo.sql
#
ds2.datasource.driverClassName=org.postgresql.Driver

#开发环境 postgresql
ds2.datasource.url0=jdbc:postgresql://localhost:5432/abc
ds2.datasource.username0=postgres
ds2.datasource.password0=xxx

#生产环境 greenPlum
ds2.datasource.url1=jdbc:postgresql://10.19.19.19:5432/gxeaa
ds2.datasource.username1=xxx
ds2.datasource.password1=xx

ds2.datasource.initialSize=20
ds2.datasource.minIdle=20
ds2.datasource.maxActive=2000
ds2.datasource.maxWait=60000
ds2.datasource.timeBetweenEvictionRunsMillis=60000
ds2.datasource.minEvictableIdleTimeMillis=300000
ds2.datasource.testWhileIdle=true
ds2.datasource.testOnBorrow=false
ds2.datasource.testOnReturn=false
ds2.datasource.poolPreparedStatements=true
ds2.datasource.maxPoolPreparedStatementPerConnectionSize=20

 

配置类1

package com.superman.globaldao;

import javax.sql.DataSource;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
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 com.alibaba.druid.pool.DruidDataSource;

/**
*
* @author yushen
*
*/
@Configuration
@MapperScan(basePackages = Datasource1Config.PACKAGE, sqlSessionFactoryRef = "ds1SqlSessionFactory")
public class Datasource1Config {
// 精确到 master 目录,以便跟其他数据源隔离
static final String PACKAGE = "com.superman.globaldao.ds1";
static final String MAPPER_LOCATION = "classpath:mybatis/mapper/ds1/*.xml";


@Value("${ds.datasource.linktype}")
private String linktype;

@Value("${ds1.datasource.url0}")
private String url0;
@Value("${ds1.datasource.username0}")
private String user0;
@Value("${ds1.datasource.password0}")
private String password0;

@Value("${ds1.datasource.url1}")
private String url1;
@Value("${ds1.datasource.username1}")
private String user1;
@Value("${ds1.datasource.password1}")
private String password1;


@Value("${ds1.datasource.driverClassName}")
private String driverClass;

@Value("${ds1.datasource.maxActive}")
private Integer maxActive;
@Value("${ds1.datasource.minIdle}")
private Integer minIdle;
@Value("${ds1.datasource.initialSize}")
private Integer initialSize;
@Value("${ds1.datasource.maxWait}")
private Long maxWait;
@Value("${ds1.datasource.timeBetweenEvictionRunsMillis}")
private Long timeBetweenEvictionRunsMillis;
@Value("${ds1.datasource.minEvictableIdleTimeMillis}")
private Long minEvictableIdleTimeMillis;
@Value("${ds1.datasource.testWhileIdle}")
private Boolean testWhileIdle;
@Value("${ds1.datasource.testWhileIdle}")
private Boolean testOnBorrow;
@Value("${ds1.datasource.testOnBorrow}")
private Boolean testOnReturn;

@Bean(name = "ds1DataSource")
@Primary
public DataSource ds1DataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(driverClass);
if(linktype.equals("test")) {
dataSource.setUrl(url0);
dataSource.setUsername(user0);
dataSource.setPassword(password0);
}else if(linktype.equals("formal")) {
dataSource.setUrl(url1);
dataSource.setUsername(user1);
dataSource.setPassword(password1);
}


//连接池配置
dataSource.setMaxActive(maxActive);
dataSource.setMinIdle(minIdle);
dataSource.setInitialSize(initialSize);
dataSource.setMaxWait(maxWait);
dataSource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
dataSource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
dataSource.setTestWhileIdle(testWhileIdle);
dataSource.setTestOnBorrow(testOnBorrow);
dataSource.setTestOnReturn(testOnReturn);
dataSource.setValidationQuery("SELECT 'x'");

dataSource.setPoolPreparedStatements(true);
dataSource.setMaxPoolPreparedStatementPerConnectionSize(20);

return dataSource;
}

@Bean(name = "ds1TransactionManager")
@Primary
public DataSourceTransactionManager ds1TransactionManager() {
return new DataSourceTransactionManager(ds1DataSource());
}

@Bean(name = "ds1SqlSessionFactory")
@Primary
public SqlSessionFactory ds1SqlSessionFactory(@Qualifier("ds1DataSource") DataSource ds1DataSource)
throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(ds1DataSource);
sessionFactory.setTypeAliasesPackage("nc.edu.nuc.Test.entity");
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources(Datasource1Config.MAPPER_LOCATION));
return sessionFactory.getObject();
}
}

 

配置类二

package com.superman.globaldao;

import javax.sql.DataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import com.alibaba.druid.pool.DruidDataSource;

/**
*
* @author yushen
*
*/
@Configuration
@MapperScan(basePackages = Datasource2Config.PACKAGE, sqlSessionFactoryRef = "ds2SqlSessionFactory")
public class Datasource2Config {
// 精确到 master 目录,以便跟其他数据源隔离
static final String PACKAGE = "com.superman.globaldao.ds2";
static final String MAPPER_LOCATION = "classpath:mybatis/mapper/ds2/*.xml";




@Value("${ds.datasource.linktype}")
private String linktype;

@Value("${ds2.datasource.url0}")
private String url0;
@Value("${ds2.datasource.username0}")
private String user0;
@Value("${ds2.datasource.password0}")
private String password0;

@Value("${ds2.datasource.url1}")
private String url1;
@Value("${ds2.datasource.username1}")
private String user1;
@Value("${ds2.datasource.password1}")
private String password1;


@Value("${ds2.datasource.driverClassName}")
private String driverClass;

@Value("${ds2.datasource.maxActive}")
private Integer maxActive;
@Value("${ds2.datasource.minIdle}")
private Integer minIdle;
@Value("${ds2.datasource.initialSize}")
private Integer initialSize;
@Value("${ds2.datasource.maxWait}")
private Long maxWait;
@Value("${ds2.datasource.timeBetweenEvictionRunsMillis}")
private Long timeBetweenEvictionRunsMillis;
@Value("${ds2.datasource.minEvictableIdleTimeMillis}")
private Long minEvictableIdleTimeMillis;
@Value("${ds2.datasource.testWhileIdle}")
private Boolean testWhileIdle;
@Value("${ds2.datasource.testWhileIdle}")
private Boolean testOnBorrow;
@Value("${ds2.datasource.testOnBorrow}")
private Boolean testOnReturn;

@Bean(name = "ds2DataSource")
public DataSource ds2DataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(driverClass);
if(linktype.equals("test")) {
dataSource.setUrl(url0);
dataSource.setUsername(user0);
dataSource.setPassword(password0);
}else if(linktype.equals("formal")) {
dataSource.setUrl(url1);
dataSource.setUsername(user1);
dataSource.setPassword(password1);
}

//连接池配置
dataSource.setMaxActive(maxActive);
dataSource.setMinIdle(minIdle);
dataSource.setInitialSize(initialSize);
dataSource.setMaxWait(maxWait);
dataSource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
dataSource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
dataSource.setTestWhileIdle(testWhileIdle);
dataSource.setTestOnBorrow(testOnBorrow);
dataSource.setTestOnReturn(testOnReturn);
dataSource.setValidationQuery("SELECT 'x'");

dataSource.setPoolPreparedStatements(true);
dataSource.setMaxPoolPreparedStatementPerConnectionSize(20);

return dataSource;
}

@Bean(name = "ds2TransactionManager")
public DataSourceTransactionManager ds2TransactionManager() {
return new DataSourceTransactionManager(ds2DataSource());
}

@Bean(name = "ds2SqlSessionFactory")
public SqlSessionFactory ds2SqlSessionFactory(@Qualifier("ds2DataSource") DataSource ds2DataSource)
throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(ds2DataSource);
sessionFactory.setTypeAliasesPackage("nc.edu.nuc.Test.entity");
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources(Datasource2Config.MAPPER_LOCATION));
return sessionFactory.getObject();
}
}

  • 在对应的地方写好xml和 dao 的接口即可

 

 

 

ok

 

 

持续更新

 

 

举报

相关推荐

0 条评论