Spring多数据源的配置 - 极悦
专注Java教育14年 全国咨询/投诉热线:444-1124-454
极悦LOGO图
始于2009,口口相传的Java黄埔军校
首页 hot资讯 Spring多数据源的配置

Spring多数据源的配置

更新时间:2022-03-24 09:55:51 来源:极悦 浏览1397次

很多朋友对Spring多数据源的配置不是很了解,下面小编就来给大家详细介绍一下。

1.什么是数据源

ADataSource是连接到物理数据库的工厂。它是DriverManager工具的替代方案。数据源使用 URL 以及用户名/密码凭据来建立数据库连接。

在 Java 中,数据源实现了javax.sql.DataSource接口。此数据源通常会在 JNDI 服务中注册,并且可以使用其 JNDI 名称来发现。

我们可以使用数据源来获取:

标准Connection对象

可用于连接池的连接

可用于分布式事务和连接池的连接

2.配置数据源

Spring boot 允许以两种方式定义数据源配置:

Java 配置

属性配置

在应用程序启动期间,在为我们配置DataSource bean之前DataSourceAutoConfiguration检查类路径上的DataSource.class(或EmbeddedDatabaseType.class )以及其他一些事情。

(1)Maven 依赖

如果尚未定义,请将spring-boot-starter-data-jpa包含到项目中。这种依赖带来了所有必要的依赖,包括各种数据库的 JDBC 驱动程序,例如mysql-connector-java连接到MySQL数据库。

如果我们计划在某个步骤(例如,测试)使用嵌入式数据库,我们可以单独导入H2 DB。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>2.4.1</version> 
    <scope>runtime</scope> 
</dependency>

(2)属性配置

DataSource配置由文件spring.datasource.*中的配置属性条目 ( ) 提供application.properties。

属性配置将配置与应用程序代码分离。这样,我们甚至可以从配置提供者系统中导入数据源配置。

下面给出的配置显示了H2、MySQL、Oracle和SQL Server数据库的示例属性。

# H2 DB
spring.datasource.url=jdbc:h2:file:C:/temp/test
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.driverClassName=org.h2.Driver
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
# MySQL
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=dbuser
spring.datasource.password=dbpass
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
# Oracle
spring.datasource.url=jdbc:oracle:thin:@localhost:1521:orcl
spring.datasource.username=dbuser
spring.datasource.password=dbpass
spring.datasource.driver-class-name=oracle.jdbc.OracleDriver
spring.jpa.database-platform=org.hibernate.dialect.Oracle10gDialect
# SQL Server
spring.datasource.url=jdbc:sqlserver://localhost;databaseName=springbootdb
spring.datasource.username=dbuser
spring.datasource.password=dbpass
spring.datasource.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver
spring.jpa.hibernate.dialect=org.hibernate.dialect.SQLServer2012Dialect

(3)Java 配置

创建DataSource bean 的推荐方法是在使用@Configuration注释注释的类中使用DataSourceBuilder类。

给出的是 H2 DB 的示例 bean。请根据需要配置其他 bean。

@Configuration
public class JpaConfig {
    @Bean
    public DataSource getDataSource()
    {
        DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
        dataSourceBuilder.driverClassName("org.h2.Driver");
        dataSourceBuilder.url("jdbc:h2:file:C:/temp/test");
        dataSourceBuilder.username("sa");
        dataSourceBuilder.password("");
        return dataSourceBuilder.build();
    }
}

(4)JNDI 数据源

假设我们将 Spring Boot 应用程序部署到应用程序服务器。在这种情况下,我们可能希望使用 Application Server 的内置功能来配置和管理 DataSource,并使用 JNDI 访问它。

我们可以使用spring.datasource.jndi-name属性来做到这一点。

#JBoss defined datasource using JNDI
spring.datasource.jndi-name = java:jboss/datasources/testDB

3.连接池

(1)HikariCP、Tomcat 池和 Commons DBCP2

对于要创建的池数据源,Spring boot 会验证有效的Driver类是否可用。如果我们设置spring.datasource.driver-class-name属性,那么必须找到并加载提到的驱动程序类。

自动配置首先尝试查找和配置HikariCP。如果 HikariCP 可用,它总是选择它。

否则,如果找到Tomcat Pooling,则对其进行配置。

如果 HikariCP 和 Tomcat Pooling 数据源都不可用,并且Commons DBCP2可用,则使用它。

spring-boot-starter-data-jpastarter 自动获得对HikariCP.

(2)自定义连接池默认值

还可以通过使用它们各自的前缀(、和)来微调特定于实现的设置。spring.datasource.hikari.*spring.datasource.tomcat.*spring.datasource.dbcp2.*

例如,我们可以使用以下属性来自定义 DBCP2 连接池。

spring.datasource.dbcp2.initial-size = 50
spring.datasource.dbcp2.max-idle = 50
spring.datasource.dbcp2.default-query-timeout = 10000
spring.datasource.dbcp2.default-auto-commit = true

4.Spring boot 多数据源

要配置多个数据源,请根据需要创建任意数量的 bean 定义,但将其中一个DataSource实例标记为@Primary。

请记住,如果我们创建自己的数据源,自动配置就会退出。在这种情况下,我们负责为所有数据源 bean 提供配置。

@Configuration
public class JpaConfig {
    @Bean(name = "h2DataSource")
    public DataSource h2DataSource()
    {
        DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
        dataSourceBuilder.driverClassName("org.h2.Driver");
        dataSourceBuilder.url("jdbc:h2:file:C:/temp/test");
        dataSourceBuilder.username("sa");
        dataSourceBuilder.password("");
        return dataSourceBuilder.build();
    }
    @Bean(name = "mySqlDataSource")
    @Primary
    public DataSource mySqlDataSource()
    {
        DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
        dataSourceBuilder.url("jdbc:mysql://localhost/testdb");
        dataSourceBuilder.username("dbuser");
        dataSourceBuilder.password("dbpass");
        return dataSourceBuilder.build();
    }
}

在自动装配数据源时,spring boot 将首选主数据源,即“mySqlDataSource”。要自动装配另一个非主数据源,请使用@Qualifier注释。

自动装配主数据源

@Autowired
DataSource dataSource;

Autowire 非主数据源

@Autowired
@Qualifier("h2DataSource")
DataSource dataSource;

5. 结论

Spring boot 提供了创建数据源 bean 的直接方法——使用属性配置或使用 java 配置。Spring Boot 提供现成的自动配置以供使用,可以使用application.properties文件中的高级选项进一步定制。

Spring boot 尝试查找和配置连接池,首先是 HikariCP,其次是 Tomcat 池,最后是 Commons DBCP2。HikariCP内置spring-boot-starter-jdbc或spring-boot-starter-data-jpa启动器。

我们可以配置多个数据源,我们必须标记为其中之一@Primary。默认情况下,主数据源是自动装配的,其他数据源需要与@Qualifier注释一起自动装配。

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>