通过上一节的介绍,我们已经知道了如何使用 Spring 进行数据源的配置以及应用。在一些复杂的应用中,可能需要访问多个数据库,每个数据库可能负责不同的业务功能或数据存储。 那么,如果我们程序中需要两个或者两个以上数据源该怎么办呢? 本文将介绍如何使用 Spring 实现多数据源的配置和使用。
在创建数据源之前,我们先预先定义好两个数据源的信息,注意前缀要区分开。
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console
# 创建第一个数据源信息
spring.datasource.jdbc-url=jdbc:h2:mem:db1
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
# 创建第二个数据源信息
spring.datasource2.jdbc-url=jdbc:h2:mem:db2
spring.datasource2.driverClassName=org.h2.Driver
spring.datasource2.username=sa
spring.datasource2.password=
创建第一个 Datasource1Config.java
文件,然后使用 @Configuration
注解声明这是一个配置类。再使用 @Bean
配合 @ConfigurationProperties
来获取数据源的信息用来创建 dataSource
和 jdbcTemplate
以备后面查询使用。
package com.cheney.demo.config;
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.core.JdbcTemplate;
import javax.sql.DataSource;
@Configuration
public class Datasource1Config {
@Bean
@ConfigurationProperties("spring.datasource")
public DataSource dataSource(){
return DataSourceBuilder.create().build();
}
@Bean
public JdbcTemplate jdbcTemplate(DataSource dataSource){
return new JdbcTemplate(dataSource);
}
}
创建第一个 Datasource2Config.java
文件,然后使用 @Configuration
注解声明这是一个配置类。再使用 @Bean
配合 @ConfigurationProperties
来获取数据源的信息用来创建 dataSource2
和 jdbcTemplate2
以备后面查询使用。
package com.cheney.demo.config;
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.core.JdbcTemplate;
import javax.sql.DataSource;
@Configuration
public class Datasource2Config {
@Bean
@ConfigurationProperties("spring.datasource2")
public DataSource dataSource2(){
return DataSourceBuilder.create().build();
}
@Bean
public JdbcTemplate jdbcTemplate2(@Qualifier("dataSource2") DataSource dataSource){
return new JdbcTemplate(dataSource);
}
}
创建了一个正常的 Spring 启动类,分别注入了两套 JdbcTemplate
和 对外访问接口。
package com.cheney.demo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.sql.SQLException;
@SpringBootApplication
@RestController
@Slf4j
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@Autowired
private JdbcTemplate jdbcTemplate;
@Autowired
private JdbcTemplate jdbcTemplate2;
@RequestMapping("db1")
public String getUserFromDataSource1() throws SQLException {
return jdbcTemplate.queryForList("select * from t_user").toString();
}
@RequestMapping("db2")
public String getUserFromDataSource2(){
return jdbcTemplate2.queryForList("select * from t_user").toString();
}
}
通过控制台,我们可以看到启动了两个数据库连接分别是 conn0
和 conn1
并且都打印出了 RUL 等信息
1)使用 h2
数据库控制台连接 db1
,创建表并登陆数据
访问下面 URL
http://localhost:8080/h2-console
使用 application.properties
里定义的第一个数据源的 URL 进行连接
点击 Connect 按钮,进入控制台。输入 建表语句并插入一条数据
CREATE TABLE IF NOT EXISTS `t_user` (
`id` INTEGER PRIMARY KEY AUTO_INCREMENT,
`name` VARCHAR(32) NOT NULL,
`age` INTEGER NOT NULL
);
INSERT INTO `t_user` (`id`, `name`, `age`) VALUES (1, 'cheney', '11');
点击 Run(绿色三角图标)
这就完成了对数据源1的建表和做数据(注意此条数据 age 是 11)
1)使用 h2
数据库控制台连接 db2
,创建表并登陆数据
连接方法一致,此时执行 sql
CREATE TABLE IF NOT EXISTS `t_user` (
`id` INTEGER PRIMARY KEY AUTO_INCREMENT,
`name` VARCHAR(32) NOT NULL,
`age` INTEGER NOT NULL
);
INSERT INTO `t_user` (`id`, `name`, `age`) VALUES (1, 'cheney', '22');
点击 Connect 按钮,进入控制台。输入 建表语句并插入一条数据,点击 Run(绿色三角图标)
这就完成了对数据源1的建表和做数据(注意此条数据 age 是 22)
使用浏览器,先访问第一个数据源,使用如下 URL
http://localhost:8080/db1
和我们之前插入数据库的值一样, age 是 11
使用浏览器,先访问第二个数据源,使用如下 URL
http://localhost:8080/db2
和我们之前插入数据库的值一样, age 是 22
这样就可以分开使用数据库了,此处我们使用了两个数据源都是 h2 数据库,你也可以使用两个不一样的数据库。此处仅做了查询,你也可以做 insert 或者 update 等等。
https://github.com/cheney09/spring-practical-combat/tree/main/02/demo
本文将介绍如何使用 Spring 实现多数据源,通过一个简单的 Spring 多数据源的配置和使用示例。实际项目中,你可能需要根据具体需求进行更复杂的配置和逻辑。希望这个示例能够帮助你理解如何在 Spring 应用程序中使用多个数据源。