springboot 使用双数据源

[复制链接]
发表于 2024-10-23 14:57:04 | 显示全部楼层 |阅读模式

1、主配置

生成各个数据源的datasource注入到spring

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.sql.DataSource;

@Configuration
@EnableConfigurationProperties
@EnableTransactionManagement(proxyTargetClass = true)
public class DruidDatasourceConfig {

    /**
     * 添加 DruidDataSource 组件到容器中,并绑定属性
     */
    @Bean("druidMysql")
    @ConfigurationProperties(prefix = "spring.datasource.druid.mysql")
//    @ConditionalOnProperty(name = "spring.datasource.type", havingValue = "com.alibaba.druid.pool.DruidDataSource")
    public DataSource druidMysql() {
        return DruidDataSourceBuilder.create().build();
    }


    @Bean("druidOracle")
    @ConfigurationProperties(prefix = "spring.datasource.druid.oracle")
//    @ConditionalOnProperty(name = "spring.datasource.type", havingValue = "com.alibaba.druid.pool.DruidDataSource")
    public DataSource druidOracle() {
        DruidDataSource oracleDataSource = DruidDataSourceBuilder.create().build();
        oracleDataSource.setConnectionProperties("oracle.net.CONNECT_TIMEOUT=600000;oracle.jdbc.ReadTimeout=600000");
        oracleDataSource.setKeepAlive(true);
        oracleDataSource.setMinEvictableIdleTimeMillis(180000);
//        return DruidDataSourceBuilder.create().build();
        return oracleDataSource;
    }

    @Bean("druidCms")
    @ConfigurationProperties(prefix = "spring.datasource.druid.cms")
    public DataSource druidCms() {
        return DruidDataSourceBuilder.create().build();
    }
}

使用datasource

创建 sqlSeessionTemplate、trasactionManager sqlSeessionFactory 来指定mybatis xml文件路径

import com.test1.xxx.timer.common.constant.CommonDataBaseConstants;
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.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;

/**
 * cms数据源配置类,修改扫描包的格式
 */
@Configuration
@MapperScan(basePackages = {"com.test1.xxx.timer.xxx.syncPresoDataPositionMapping.dao",
        "com.test1.xxx.timer.xxx.syncPresoDataMapping.dao",
        "com.test1.xxx.timer.xxx.syncPresoDataConfig.dao",
        "com.test1.xxx.timer.xxx.syncPresoAttachConfig.dao",
        "com.test1.xxx.timer.xxx.syncPresoAttachRecord.dao",
        "com.test1.xxx.timer.xxx.syncPresoDataLog.dao",
"com.test1.xxx.timer.xxx.syncdatabase.dao"}, sqlSessionFactoryRef = CommonDataBaseConstants.CMS_SQLSESSION_FACTORY)
public class CmsDatasourceConfiguration {


    @Autowired
    @Qualifier("druidCms")
    DataSource druidCms;


    @Bean("cmsSpringSqlSessionTemplate")
    public SqlSessionTemplate cmsSpringSqlSessionTemplate() throws Exception {

        return new SqlSessionTemplate(cmsSqlSessionFactory());
    }

    @Bean
    public SqlSessionFactory cmsSqlSessionFactory() throws Exception {
        String location = "classpath*:mapper/cms/**/*.xml";
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(druidCms);
        Resource[] resources = new PathMatchingResourcePatternResolver().getResources(location);
        factoryBean.setMapperLocations(resources);
        return factoryBean.getObject();
    }


    @Bean("cmsTransactionManager")
    public DataSourceTransactionManager cmsTransactionManager() {

        return new DataSourceTransactionManager(druidCms);
    }

}
import com.test1.xxx.timer.systemconfig.redis.TempRedisCache;
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.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;

@Configuration
@MapperScan(basePackages = {"com.test1.xxx.timer.**.mysql"}, sqlSessionFactoryRef = "msSqlSessionFactory")
public class MysqlDatasourceConfiguration {


    @Autowired
    @Qualifier("druidMysql")
    DataSource druidMysql;
//    @Autowired
//    @Qualifier("redisTemplate_default")
//    private RedisTemplate<String, Object> redisTemplate;

    @Bean("mysqlSpringSqlSessionTemplate")
    @Primary
    public SqlSessionTemplate mysqlSpringSqlSessionTemplate() throws Exception {

        return new SqlSessionTemplate(msSqlSessionFactory());
    }

    @Bean
    @Primary
    public SqlSessionFactory msSqlSessionFactory() throws Exception {
        String location = "classpath*:mapper/mysql/**/*.xml";
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(druidMysql);
        Resource[] resources = new PathMatchingResourcePatternResolver().getResources(location);
        factoryBean.setMapperLocations(resources);
//        String keyIdPart = "so-timer-mysql";
//        TempRedisCache tempRedisCache = new TempRedisCache(keyIdPart, redisTemplate);
//        factoryBean.setCache(tempRedisCache);
        return factoryBean.getObject();
    }


    @Bean("msTransactionManager")
    public DataSourceTransactionManager msTransactionManager() {

        return new DataSourceTransactionManager(druidMysql);
    }

}

业务使用

可以用@MapperScan指定,也可以用@Qualifier指定使用哪个数据源

@Mapper
@Qualifier("msSqlSessionFactory")
public interface DocBusinessTripExDao {
    int deleteByPrimaryKey(Long id);

    int insert(DocBusinessTripEx record);

    int insertSelective(DocBusinessTripEx record);

    DocBusinessTripEx selectByPrimaryKey(Long id);

    int updateByPrimaryKeySelective(DocBusinessTripEx record);

    int updateByPrimaryKey(DocBusinessTripEx record);

    List<DocBusinessTripEx> getBusinessTripByDocCode(String docCode);
}

GMT+8, 2025-9-5 18:25 , Processed in 0.095823 second(s), 34 queries Archiver|手机版|小黑屋|Attic ( 京ICP备2020048627号 )

快速回复 返回顶部 返回列表