(2)多個springboot項目合並的問題總結


一,解決項目合並中的多個數據源問題

今天使用spring boot配置兩個數據源,出現了問題。

上網搜了一下,結果是使用datasource.url的鍋。

spring.datasource.url 數據庫的 JDBC URL。

spring.datasource.jdbc-url 用來創建連接的 JDBC URL。

官方文檔的解釋是:

因為連接池的實際類型沒有被公開,所以在您的自定義數據源的元數據中沒有生成密鑰,而且在IDE中沒有完成(因為DataSource接口沒有暴露屬性)。另外,如果您碰巧在類路徑上有Hikari,那么這個基本設置就不起作用了,因為Hikari沒有url屬性(但是確實有一個jdbcUrl屬性)。在這種情況下,您必須重寫您的配置如下:

spring.datasource.db1.jdbc-url=jdbc:mysql://193.9.71.47:3306/big_data_platform?useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.datasource.db1.username=root
spring.datasource.db1.password=Grand_403?
spring.datasource.db1.driver-class-name=com.mysql.jdbc.Driver

spring.datasource.db2.jdbc-url=jdbc:mysql://192.168.95.2:3306/app_database?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.datasource.db2.username=root
spring.datasource.db2.password=admin
spring.datasource.db2.driver-class-name=com.mysql.jdbc.Driver

所以如果數據庫中只有一個數據源的時候就使用:url

兩個以上的數據源時就使用:jdbc-url

二.多數據源的配置實現

我配置了兩個數據源,一個名字叫db1數據源,一個名字叫db2數據源,如果你想配置更多的數據源,繼續加就行了。

這里我只使用兩個數據源,所以要添加兩個配置類:

(1)db1數據源的配置: DataSourceConfig.java 

@MapperScan的作用是指定db1這個數據源在項目中的mapper的位置
nameGenerator的作用是如果不同的包下如果出現同名的類則以全路徑注冊,就不會報錯
package com.grand;

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.jdbc.datasource.DataSourceTransactionManager;

//表示這個類為一個配置類
@Configuration
//配置Mybatis的接口類放的地方
@MapperScan(value={"com.grand.p1upgrade.mapper","com.grand.quickreaction.mapper","com.grand.synchronization.db1.mapper","com.grand.springboottemplate.app.mapper","com.grand.springboottemplate.environment.mapper"},sqlSessionFactoryRef = "db1SqlSessionFactory",nameGenerator = UniqueNameGenerator.class)
public class DataSourceConfig {
    // 將這個對象放入Spring容器中
    @Bean(name = "db1")
    // 讀取application.properties中的配置參數映射成為一個對象
    // prefix表示參數的前綴
    @ConfigurationProperties(prefix = "spring.datasource.db1")
    // 表示這個數據源是默認數據源
    @Primary
    public DataSource testDataSource() {
        return DataSourceBuilder.create().build();
    }
 
    @Bean(name = "db1SqlSessionFactory")
    // 表示這個數據源是默認數據源
    @Primary
    public SqlSessionFactory testSqlSessionFactory(@Qualifier("db1") DataSource dataSource)
            throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource((dataSource));
        // 設置 MyBatis 所需的 xml文件,這里沒有使用到 xml,所以注釋掉
        // bean.setMapperLocations(
        // new
        // PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mapper/db01/*.xml"));
        return bean.getObject();
    }
 
 
    @Bean(name = "db1TransactionManager")
    // 表示這個數據源是默認數據源
    @Primary
    public DataSourceTransactionManager testTransactionManager(@Qualifier("db1") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
 
    @Bean(name = "db1SqlSessionTemplate")
    // 表示這個數據源是默認數據源
    @Primary
    public SqlSessionTemplate testSqlSessionTemplate(
            @Qualifier("db1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }

}

 

(2)db1數據源的配置: DataSource2Config.java 

@MapperScan的作用是指定db2這個數據源在項目中的mapper的位置
nameGenerator的作用是如果不同的包下如果出現同名的類則以全路徑注冊,就不會報錯
package com.grand;

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.jdbc.datasource.DataSourceTransactionManager;

//表示這個類為一個配置類
@Configuration
//配置Mybatis的接口類放的地方
@MapperScan(basePackages = "com.grand.synchronization.db2.mapper", sqlSessionFactoryRef = "db2SqlSessionFactory",nameGenerator = UniqueNameGenerator.class)
public class DataSource2Config {

    // 將這個對象放入Spring容器中
    @Bean(name = "db2")
    // 讀取application.properties中的配置參數映射成為一個對象
    // prefix表示參數的前綴
    @ConfigurationProperties(prefix = "spring.datasource.db2")
    public DataSource testDataSource() {
        return DataSourceBuilder.create().build();
    }
 
    @Bean(name = "db2SqlSessionFactory")
    public SqlSessionFactory testSqlSessionFactory(@Qualifier("db2") DataSource dataSource)
            throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource((dataSource));
        // 設置 MyBatis 所需的 xml文件,這里沒有使用到 xml,所以注釋掉
        // bean.setMapperLocations(
        // new
        // PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mapper/db01/*.xml"));
        return bean.getObject();
    }
 
 
    @Bean(name = "db2TransactionManager")
    public DataSourceTransactionManager testTransactionManager(@Qualifier("db2") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
 
    @Bean(name = "db2SqlSessionTemplate")
    public SqlSessionTemplate testSqlSessionTemplate(
            @Qualifier("db2SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

 

(3)測試結果

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM