• Springboot连接两个数据库


    一个SpringBoot项目,同时连接两个数据库:比如一个是pgsql数据库,一个是oracle数据库(啥数据库都一样,连接两个同为oracle的数据库,或两个不同的数据库,只需要更改对应的driver-class-name和jdbc-url等即可)注意:连接什么数据库,要引入对应数据库的包。

            该例子利用主从MySQL作为例子

    1、导入pom.xml(这里重点需要导入druid数据库连接池)其它的包不多介绍,你需要用到啥就导入啥,跟平时项目一样。

    1. <dependency>
    2. <groupId>com.alibabagroupId>
    3. <artifactId>druidartifactId>
    4. <version>1.1.0version>
    5. dependency>
    6. <dependency>
    7. <groupId>mysqlgroupId>
    8. <artifactId>mysql-connector-javaartifactId>
    9. <scope>runtimescope>
    10. dependency>

    2、修改application.properties配置文件(由于我采用本地的,IP地址是一致的,只是两个库不一样,实际开发中,应该是两台云服务,两台MySQL地址进行主从读写)

    1. # 端口号
    2. server.port=8090
    3. #主数据库配置 - 这里地址可以选你第一台MySQL的IP地址
    4. spring.datasource.masterdb.type=com.alibaba.druid.pool.DruidDataSource
    5. spring.datasource.masterdb.jdbc-url=jdbc:mysql://localhost:3306/shiro?characterEncoding=utf8&useSSL=true&serverTimezone=Asia/Shanghai
    6. spring.datasource.masterdb.username=root
    7. spring.datasource.masterdb.password=123456
    8. spring.datasource.masterdb.driver-class-name=com.mysql.cj.jdbc.Driver
    9. #从数据库配置 - 这里地址可以选你第二台MySQL的IP地址
    10. spring.datasource.devdb.type=com.alibaba.druid.pool.DruidDataSource
    11. spring.datasource.devdb.jdbc-url=jdbc:mysql://localhost:3306/vuedemo?characterEncoding=utf8&useSSL=true&serverTimezone=Asia/Shanghai
    12. spring.datasource.devdb.username=root
    13. spring.datasource.devdb.password=123456
    14. spring.datasource.devdb.driver-class-name=com.mysql.cj.jdbc.Driver
    15. #######其它的配置按需自行配置#########

    3、新建两个Config配置类 (注意,一定要按照这种写法)

      3.1 DBMasterConfig为主数据库DBMasterConfig.java,项目启动默认连接此数据库

    1. package com.lq.flyrabbitmail.config;
    2. import org.apache.ibatis.session.SqlSessionFactory;
    3. import org.mybatis.spring.SqlSessionFactoryBean;
    4. import org.mybatis.spring.SqlSessionTemplate;
    5. import org.mybatis.spring.annotation.MapperScan;
    6. import org.springframework.beans.factory.annotation.Qualifier;
    7. import org.springframework.boot.context.properties.ConfigurationProperties;
    8. import org.springframework.boot.jdbc.DataSourceBuilder;
    9. import org.springframework.context.annotation.Bean;
    10. import org.springframework.context.annotation.Configuration;
    11. import org.springframework.context.annotation.Primary;
    12. import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
    13. import org.springframework.jdbc.datasource.DataSourceTransactionManager;
    14. import javax.sql.DataSource;
    15. /**
    16. * @Author LQ
    17. * @Date2021/1/5 20:40
    18. * @Version V1.0
    19. * 数据库连接池 - 主库
    20. **/
    21. @Configuration
    22. @MapperScan(basePackages = "com.lq.flyrabbitmail.mapper.master", sqlSessionTemplateRef = "MasterSqlSessionTemplate")
    23. public class DruidMasterConfig {
    24. @Bean(name = "MasterDataSource")
    25. @ConfigurationProperties(prefix = "spring.datasource.masterdb")
    26. @Primary
    27. public DataSource testDataSource() {
    28. return DataSourceBuilder.create().build();
    29. }
    30. @Bean(name = "MasterSqlSessionFactory")
    31. @Primary
    32. public SqlSessionFactory testSqlSessionFactory(@Qualifier("MasterDataSource") DataSource dataSource) throws Exception {
    33. SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
    34. bean.setDataSource(dataSource);
    35. bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml"));
    36. return bean.getObject();
    37. }
    38. @Bean(name = "MasterTransactionManager")
    39. @Primary
    40. public DataSourceTransactionManager testTransactionManager(@Qualifier("MasterDataSource") DataSource dataSource) {
    41. return new DataSourceTransactionManager(dataSource);
    42. }
    43. @Bean(name = "MasterSqlSessionTemplate")
    44. @Primary
    45. public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("MasterSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
    46. return new SqlSessionTemplate(sqlSessionFactory);
    47. }
    48. }

     3.2 第二个数据库作为从数据库  DBSlaverConfig.java

    1. package com.lq.flyrabbitmail.config;
    2. import org.apache.ibatis.session.SqlSessionFactory;
    3. import org.mybatis.spring.SqlSessionFactoryBean;
    4. import org.mybatis.spring.SqlSessionTemplate;
    5. import org.mybatis.spring.annotation.MapperScan;
    6. import org.springframework.beans.factory.annotation.Qualifier;
    7. import org.springframework.boot.context.properties.ConfigurationProperties;
    8. import org.springframework.boot.jdbc.DataSourceBuilder;
    9. import org.springframework.context.annotation.Bean;
    10. import org.springframework.context.annotation.Configuration;
    11. import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
    12. import org.springframework.jdbc.datasource.DataSourceTransactionManager;
    13. import javax.sql.DataSource;
    14. /**
    15. * @Author LQ
    16. * @Date2021/1/5 20:40
    17. * @Version V1.0
    18. * 数据库连接池 - 从库
    19. **/
    20. @Configuration
    21. @MapperScan(basePackages = "com.lq.flyrabbitmail.mapper.slaver", sqlSessionTemplateRef = "MasterSqlSessionTemplate")
    22. public class DruidDevdbConfig {
    23. @Bean(name = "SalverDataSource")
    24. @ConfigurationProperties(prefix = "spring.datasource.devdb")
    25. public DataSource testDataSource() { return DataSourceBuilder.create().build(); }
    26. @Bean(name = "SalverSqlSessionFactory")
    27. public SqlSessionFactory testSqlSessionFactory(@Qualifier("SalverDataSource") DataSource dataSource) throws Exception {
    28. SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
    29. bean.setDataSource(dataSource);
    30. bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml"));
    31. return bean.getObject();
    32. }
    33. @Bean(name = "SalverTransactionManager")
    34. public DataSourceTransactionManager testTransactionManager(@Qualifier("SalverDataSource") DataSource dataSource) {
    35. return new DataSourceTransactionManager(dataSource);
    36. }
    37. @Bean(name = "SalverSqlSessionTemplate")
    38. public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("SalverSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
    39. return new SqlSessionTemplate(sqlSessionFactory);
    40. }
    41. }

    4、在Mapper包下新建两个子包master 和 slaver 分别放两个不同数据库的dao层文件(具体位置看上面项目截图)

    1. /* 这里就列举UserMapper RoleMapper一样 */
    2. @Mapper
    3. public interface UserMapper {
    4. @Select("SELECT id,DATEDIFF(endtime,starttime) FROM task WHERE STATUS = '进行'")
    5. List selct();
    6. }

    注意:主数据库不需要加@Transactional(value = "SalverTransactionManager")从数据库需要添加

    事务在从数据库使用

    5、在resource下新建mapper文件夹,分别放入对应dao层的xml文件(具体看项目截图,这里一定要创建,不然会报错

    6、可以进行使用了,这里我使用Juit进行测试

    1. @SpringBootTest
    2. class FlyrabbitmailApplicationTests {
    3. @Autowired
    4. private UserMapper userMapper;
    5. @Test
    6. void contextLoads() {
    7. List selct = userMapper.selct();
    8. System.out.println(selct);
    9. }
    10. }

    主从双数据库可以进行读写分离,提高数据库的吞吐量,提高并发能力。

  • 相关阅读:
    javascript复习之旅 9.2初识到手写 javascript 中的 bind 函数
    雪花算法基本原理与实现
    手写HashMap 手撕哈希表
    hive sql 行列转换 开窗函数 炸裂函数
    【毕业设计】基于情感分析的网络舆情热点分析系统
    云原生爱好者周刊:使用树莓派组建 K8s 集群 | 2022-08-08
    SCXI-1104C NI 利用人工智能和机器学习进行网络防御
    Redis集群启动
    学硕408,专硕两门改四门!双一流湘潭大学计算机考研改考
    图片接口文档怎么写
  • 原文地址:https://blog.csdn.net/qq_42217363/article/details/126295290