Spring多个数据源配置详解

作者:程序员阿牛 时间:2023-09-20 18:22:18 

前言

在上篇文章讲到了如何配置单数据源,但是在实际场景中,会有需要配置多个数据源的场景,比如说,我们在支付系统中,单笔操作(包含查询、插入、新增)中需要操作主库,在批量查询或者对账单查询等对实时性要求不高的场景,需要使用读库来操作,依次来减轻数据库的压力。那么我们如何配置多数据源?

这里还是基于springboot应用的情况下,我们看一下怎么配置。

因为SpringBoot会实现自动配置,但是SpringBoot并不知道我们的业务场景分别要使用哪一个数据源,因此我们需要把相关的自动配置关闭。

首先,生成项目骨架,引入相应的依赖


 <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
```
**然后,在Application排除自动装配类**  

```java
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class,DataSourceTransactionManagerAutoConfiguration.class,JdbcTemplateAutoConfiguration.class})
@Slf4j
public class MultiDataSourceDemoApplication {
}

上面代码中,我们排除了DataSourceAutoConfiguration、DataSourceTransactionManagerAutoConfiguration、JdbcTemplateAutoConfiguration三个类,然后就可以自己定义DataSource了。

配置数据源


//第一个数据源
@Bean
@ConfigurationProperties("first.datasource")
public DataSource firstDataSource() {
return DataSourceBuilder.create().build();
}

@Bean
public JdbcTemplate firstJdbcTemplate() {
return new JdbcTemplate(firstDataSource());
}

@Bean
@Resource
public PlatformTransactionManager firstTxManager(DataSource firstDataSource) {
return new DataSourceTransactionManager(firstDataSource);
}

//第二个数据源
@Bean
@ConfigurationProperties("second.datasource")
public DataSource secondDataSource() {
return DataSourceBuilder.create().build();
}

@Bean
public JdbcTemplate secondJdbcTemplate() {
return new JdbcTemplate(secondDataSource());
}

@Bean
@Resource
public PlatformTransactionManager secondTxManager(DataSource secondDataSource) {
return new DataSourceTransactionManager(secondDataSource);
}

application.properties的配置项信息


management.endpoints.web.exposure.include=*
spring.output.ansi.enabled=ALWAYS

first.datasource.jdbc-url=jdbc:mysql://localhost:3306/first
first.datasource.username=root
first.datasource.password=xxx
second.datasource.jdbc-url=jdbc:mysql://localhost:3306/second
second.datasource.username=root
second.datasource.password=xxx

看一下表结构和数据

Spring多个数据源配置详解

Spring多个数据源配置详解

运行测试代码:


@Test
public void testMutilDataSource(){
firstJdbcTemplate.queryForList("SELECT * FROM test1")
.forEach(row -> log.info("记录:"+row.toString()));

secondJdbcTemplate.queryForList("SELECT * FROM test2")
.forEach(row -> log.info("记录:"+row.toString()));
}

我们看一下运行效果:

Spring多个数据源配置详解

我们可以看到,两个数据源都初始化成功了,并且各自数据源执行的结果准确。

上面的方式没有集成Mybatis,使用的是jdbcTemplate,网络上还有很多配置方式,比如动态选择数据源,大同小异,不过笔者还是建议不同的业务单独指定数据源,容易维护。

我们已经演示了简单的单数据源和多数据源的配置方式,我们下一篇文章将讲一下,SpringBoot默认的连接池HikariCP。

来源:https://www.cnblogs.com/coderaniu/p/15180116.html

标签:Spring,多数据源
0
投稿

猜你喜欢

  • Java ClassLoader虚拟类实现代码热替换的示例代码

    2022-06-25 03:08:52
  • Java MapStruct解了对象映射的毒

    2022-08-20 11:37:12
  • SpringAOP事务配置语法及实现过程详解

    2023-12-27 21:26:16
  • C#实现json的序列化和反序列化实例代码

    2022-07-18 01:50:34
  • 使用Android studio创建的AIDL编译时找不到自定义类的解决办法

    2023-06-23 10:59:41
  • Springboot快速入门教程

    2023-03-02 21:50:56
  • Java实现冒泡排序算法

    2023-07-13 03:02:28
  • Java ExecutorService四种线程池使用详解

    2023-05-17 07:12:56
  • c#创建浮动工具栏功能示例

    2022-08-31 01:08:31
  • Java 实战项目之毕业设计管理系统的实现流程

    2021-12-26 00:10:10
  • C++ OpenCV单峰三角阈值法Thresh_Unimodal详解

    2022-06-09 14:36:46
  • 浅析Java的Hibernate框架中的缓存和延迟加载机制

    2023-04-12 15:58:00
  • Android蓝牙的开启和搜索设备功能开发实例

    2022-11-07 20:42:17
  • GridView基于pulltorefresh实现下拉刷新 上拉加载更多功能(推荐)

    2022-08-29 23:51:58
  • 解读classpath读取resources目录下的文件

    2023-01-25 05:49:36
  • Java Benchmark 基准测试的实例详解

    2023-10-08 11:01:02
  • C#一个方法返回多个值示例

    2023-06-22 18:38:49
  • 如何将Object类转换为实体类

    2021-11-05 04:45:11
  • java实现点击按钮事件弹出子窗口

    2023-11-17 14:54:45
  • 分享WCF聊天程序--WCFChat实现代码

    2023-01-19 17:04:59
  • asp之家 软件编程 m.aspxhome.com