springboot+mybatis配置多数据源(postgre)


项目里面配置数据源,一般采取 数据源+数据库连接池的模式。

几种数据源的配置模式:单数据源、多数据源静态配置、多数据源动态配置。

常用的数据库连接池:c3p0,Druid,DBCP等。本文以c3p0为主。

一、单数据源的配置(springboot+mybatis+postgresql+c3p0):

 1、项目结构:项目里面mapper.java和mapper.xml在同一目录下。

2、pom.xml里面的jar包:

<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
</dependency>
<dependency>
    <groupId>com.mchange</groupId>
    <artifactId>c3p0</artifactId>
</dependency>
pom.xml

3、 application-dev.properties里面的配置:

spring.datasource.url=jdbc:postgresql://127.0.0.1:3306/aa
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=org.postgresql.Driver
spring.datasource.max-idle=10
spring.datasource.max-wait=10000
spring.datasource.min-idle=5
spring.datasource.initial-size=5
spring.datasource.type=com.mchange.v2.c3p0.ComboPooledDataSource
application-dev.properties

4、config文件

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.config.GlobalConfig;
import com.baomidou.mybatisplus.core.config.GlobalConfig.DbConfig;
import com.baomidou.mybatisplus.extension.incrementer.PostgreKeyGenerator;

@Configuration
@MapperScan("com.demo.mapper*")
public class MybatisConfig {

    @Bean
    public GlobalConfig globalConfiguration() {
        GlobalConfig global = new GlobalConfig();
        DbConfig dbConfig = new DbConfig();
        global.setDbConfig(dbConfig);
        dbConfig.setKeyGenerator(new PostgreKeyGenerator());
        dbConfig.setDbType(DbType.POSTGRE_SQL);
        return global;
    }

}
MybatisConfig.java

 

二、多数据源静态配置(springboot+mybatis+postgresql+c3p0)

 1、项目结构:项目里面各个模块的mapper.java和mapper.xml在各个模块的同一目录下。

2、pom.xml里面的jar包:

<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
</dependency>
<dependency>
    <groupId>com.mchange</groupId>
    <artifactId>c3p0</artifactId>
</dependency>
pom.xml

3、 application-dev.properties里面的配置:

spring.datasource.spdsdb.jdbc-url=jdbc:postgresql://127.0.0.1:3306/spdsdb
spring.datasource.spdsdb.username=root
spring.datasource.spdsdb.password=123456
spring.datasource.spdsdb.driver-class-name=org.postgresql.Driver
spring.datasource.spdsdb.max-idle=10
spring.datasource.spdsdb.max-wait=10000
spring.datasource.spdsdb.min-idle=5
spring.datasource.spdsdb.initial-size=5
spring.datasource.spdsdb.type=com.mchange.v2.c3p0.ComboPooledDataSource



spring.datasource.orderdb.jdbc-url=jdbc:postgresql://127.0.0.1:3306/orderdb
spring.datasource.orderdb.username=orderdata
spring.datasource.orderdb.password=123456
spring.datasource.orderdb.driver-class-name=org.postgresql.Driver
spring.datasource.orderdb.max-idle=10
spring.datasource.orderdb.max-wait=10000
spring.datasource.orderdb.min-idle=5
spring.datasource.orderdb.initial-size=5
spring.datasource.orderdb.type=com.mchange.v2.c3p0.ComboPooledDataSource
application-dev.properties

4、datasource文件

主数据源:

import javax.sql.DataSource;
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.boot.jdbc.DataSourceBuilder;
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;

@Configuration
@MapperScan(basePackages = {DataSourceSpdsDB.PACKAGE},sqlSessionFactoryRef = "spdsSqlSessionFactory")
public class DataSourceSpdsDB {

    //精确到目录,以便跟其他数据源隔离
    static final String PACKAGE = "com.demo.product.mapper";
    static final String MAPPER_LOCATION = "classpath*:com.demo.product.mapper/*.xml";


    @Bean(name="spdsDataSource")
    @Primary
    @ConfigurationProperties(prefix = "spring.datasource.spdsdb")
    public DataSource dataSource(){
        return DataSourceBuilder.create().build();
    }

    /**
     * 返回数据库的会话工厂
     */
    @Bean(name = "spdsSqlSessionFactory")
    @Primary
    public SqlSessionFactory sqlSessionFactory(@Qualifier("spdsDataSource") DataSource ds) throws Exception{
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(ds);
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(MAPPER_LOCATION));
        return bean.getObject();
    }

    /**
     * 返回数据库的会话模板
     */
    @Bean(name = "spdsSqlSessionTemplate")
    @Primary
    public SqlSessionTemplate sqlSessionTemplate(@Qualifier("spdsSqlSessionFactory") SqlSessionFactory sessionFactory) throws  Exception{
        return  new SqlSessionTemplate(sessionFactory);
    }

    /**
     * 返回数据库的事务
     */
    @Bean(name = "spdsTransactionManager")
    @Primary
    public DataSourceTransactionManager transactionManager(@Qualifier("spdsDataSource") DataSource ds){
        return new DataSourceTransactionManager(ds);
    }

}
DataSourceSpdsDB.java

从数据源:

import javax.sql.DataSource;
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.boot.jdbc.DataSourceBuilder;
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;

@Configuration
@MapperScan(basePackages = {DataSourceOrderDB.PACKAGE},sqlSessionFactoryRef = "orderSqlSessionFactory")
public class DataSourceOrderDB {
    
    //精确到目录,以便跟其他数据源隔离
    static final String PACKAGE = "com.demo.trading.mapper";
    static final String MAPPER_LOCATION = "classpath*:com.demo.trading.mapper/*.xml";


    @Bean(name="orderDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.orderdb")
    public DataSource dataSource(){
        return DataSourceBuilder.create().build();
    }

    /**
     * 返回数据库的会话工厂
     */
    @Bean(name = "orderSqlSessionFactory")
    public SqlSessionFactory sqlSessionFactory(@Qualifier("orderDataSource") DataSource ds) throws Exception{
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(ds);
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(MAPPER_LOCATION));
        return bean.getObject();
    }

    /**
     * 返回数据库的会话模板
     */
    @Bean(name = "orderSqlSessionTemplate")
    public SqlSessionTemplate sqlSessionTemplate(@Qualifier("orderSqlSessionFactory") SqlSessionFactory sessionFactory) throws  Exception{
        return  new SqlSessionTemplate(sessionFactory);
    }

    /**
     * 返回数据库的事务
     */
    @Bean(name = "orderTransactionManager")
    public DataSourceTransactionManager transactionManager(@Qualifier("orderDataSource") DataSource ds){
        return new DataSourceTransactionManager(ds);
    }

}
DataSourceOrderDB.java

此处有一坑:

由于此处没有把单数据源里面MybatisConfig.java文件上面的全局扫描注解@MapperScan("com.demo.*.mapper")给删掉,导致操作从数据源的表时,

一直报错,表不存在:Relation "xxx" not exist

 参考文章:

https://www.cnblogs.com/ziyue7575/p/549bc1f2e0996ed979bd09c25a6a26c0.html

 

三、多数据源动态配置(springboot+mybatis)

参考文章:

https://blog.csdn.net/xp541130126/article/details/81739760

https://www.cnblogs.com/CryOnMyShoulder/p/12218876.html

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM