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