Spring Boot 3.x Data(一)-SQL数据源配置

本文详细介绍了SpringBoot中数据源的配置,包括嵌入式数据库支持、DataSource配置、连接池设置以及如何连接到JNDI数据源。SpringBoot自动配置了HikariCP作为首选连接池,但也支持其他如Tomcat和DBCP2。通过`spring.datasource.*`属性可以轻松定制数据源,同时支持通过JNDI访问数据源。此外,文章还提到了如何自定义数据源配置和使用DataSourceBuilder创建数据源。

系列文章目录


前言

Spring Boot集成了许多数据技术,包括SQLNoSQL

一、SQL数据库

Spring框架为使用SQL数据库提供了广泛的支持,从使用JdbcTemplate的直接JDBC访问到完成“对象关系映射”技术(如Hibernate)。
Spring Data提供了一个额外的功能:直接从接口创建Repository,并使用约定从方法名生成查询。

配置数据源

Java中javax.sql.DataSource接口提供了处理数据库连接的标准方法。“DataSource”使用URL和一些凭证来建立数据库连接。

嵌入式数据库支持

使用内存内嵌入式数据库开发应用程序通常很方便。显然,内存中的数据库不提供持久存储。您需要在应用程序启动时填充数据库,并准备在应用程序结束时丢弃数据。

Spring Boot可以自动配置嵌入式的H2、HSQL和Derby数据库。你不需要提供任何连接url。你只需要包含要使用的嵌入式数据库的构建依赖项。如果类路径上有多个嵌入式数据库,则设置spring.datasource.embedded-database-connection 配置属性,用于控制使用哪一个。将该属性设置为none将禁用嵌入式数据库的自动配置。

如果你在测试中使用此特性,你可能会注意到,无论你使用多少应用程序上下文,整个测试套件都会重用相同的数据库。
如果你想确保每个上下文都有一个单独的嵌入式数据库,你应该设置spring.datasource.generate-unique-nametrue

要自动配置嵌入式数据库,需要依赖spring-jdbc。例如,典型的POM依赖如下:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.hsqldb</groupId>
            <artifactId>hsqldb</artifactId>
            <scope>runtime</scope>
        </dependency>

如果出于某种原因,为嵌入式数据库配置了连接URL,请注意确保禁用了数据库的自动关闭功能。 如果你使用H2,你应该使用DB_CLOSE_ON_EXIT=FALSE来完成,如果使用HSQLDB,应该确保没有使用shutdown=true。禁用数据库的自动关闭功能可以让Spring Boot在数据库关闭时控制,从而确保一旦不再需要对数据库的访问就会发生这种情况。

hsqldb url 配置示例:

spring:
  datasource:
    username: hsqldb
    password: hsqldb
    url: jdbc:hsqldb:mem://localhost/test;shutdown=true
    driver-class-name: org.hsqldb.jdbcDriver
    schema: classpath:schema.sql
    data: classpath:data.sql
    initialization-mode: always
    continue-on-error: true

DataSource配置

数据源配置由spring.datasource.*中的外部配置属性控制。例如,你可以在application.properties中声明以下部分:

spring:
  datasource:
    url: "jdbc:mysql://localhost/test"
    username: "dbuser"
    password: "dbpass"

你至少应该通过设置spring.datasource.url属性来指定URL。否则,Spring Boot会尝试自动配置嵌入式数据库。

Spring Boot可以从URL推导出大多数数据库的JDBC驱动程序类, 如果需要指定特定的类,可以使用spring.datasource.driver-class-name属性。

要创建一个DataSource池,我们需要能够验证一个有效的Driver类是否可用,因此我们在做任何事情之前要检查这个类。换句话说,如果你设置了spring.datasource.driver-class-name=com.mysql.jdbc.Driver,那么这个类必须是可加载的。

有关更多支持的选项,请参阅DataSourceProperties。对于特定的数据连接池,可以使用spring.datasource.hikari.*, spring.datasource.tomcat.*, spring.datasource.dbcp2.*, 和 spring.datasource.oracleucp.* 配置进行微调。
例如,如果你使用Tomcat连接池,你可以自定义许多附加设置,如下面的示例所示:

spring:
  datasource:
    tomcat:
      max-wait: 10000
      max-active: 50
      test-on-borrow: true

支持的连接池

Spring Boot使用以下算法来选择特定的实现:

  1. 我们更喜欢HikariCP的性能和并发性。如果HikariCP可用,我们总是选择它。
  2. 否则,如果Tomcat池数据源可用,我们就使用它。
  3. 否则,如果Commons DBCP2可用,我们就使用它。
  4. 如果没有HikariCP、Tomcat和DBCP2可用,如果Oracle UCP可用,我们使用它。

如果你使用spring-boot-starter-jdbcspring-boot-starter-data-jpa Starter,你将自动获得对HikariCP的依赖。

你可以完全绕过该算法,并通过设置spring.datasource.type属性指定要使用的连接池。如果在Tomcat容器中运行应用程序,这一点尤其重要,因为默认情况下提供了tomcat-jdbc
在这里插入图片描述
可以使用DataSourceBuilder手动配置其他连接池。如果你定义了自己的DataSource bean,则不会发生自动配置。DataSourceBuilder支持以下连接池:

  • HikariCP
  • Tomcat pooling Datasource
  • Commons DBCP2
  • Oracle UCP & OracleDataSource
  • Spring Framework’s SimpleDriverDataSource
  • H2 JdbcDataSource
  • PostgreSQL PGSimpleDataSource

连接到JNDI数据源

如果你将Spring Boot应用程序部署到应用程序服务器,你可能希望通过使用应用程序服务器的内置特性配置和管理数据源,并通过使用JNDI访问它。
spring.datasource.jndi-name属性可以用作spring.datasource.url的替代,spring.datasource.usernamespring.datasource.password 属性 从特定的JNDI位置访问数据源。
下面的例子展示如何访问JBoss定义的数据源:

spring:
  datasource:
    jndi-name: "java:jboss/datasources/customers"

自定义数据源配置

要配置你自己的数据源,请在你的配置中定义该类型的@Bean。 Spring Boot在任何需要的地方重用“DataSource”,包括数据库初始化。

下面的例子展示了如何在bean中定义数据源:

@Configuration(proxyBeanMethods = false)
public class MyDataSourceConfiguration {

    @Bean
    @ConfigurationProperties(prefix = "app.datasource")
    public SomeDataSource dataSource() {
        return new SomeDataSource();
    }

}

下面的例子展示了如何通过设置属性来定义数据源:

app:
  datasource:
    url: "jdbc:h2:mem:mydb"
    username: "sa"
    pool-size: 30

假设SomeDataSource具有URL、用户名和连接池大小的常规JavaBean属性,那么在DataSource对其他组件可用之前,这些设置将被自动绑定。Spring Boot还提供了一个实用工具构建类,称为DataSourceBuilder,可用于创建一个标准数据源(如果它在类路径上)。构建器可以根据类路径上可用的内容检测要使用的对象。它还基于JDBC URL自动检测驱动程序。下面的例子展示了如何使用DataSourceBuilder创建一个数据源:

@Configuration(proxyBeanMethods = false)
public class MyDataSourceConfiguration {

    @Bean
    @ConfigurationProperties("app.datasource")
    public DataSource dataSource() {
        return DataSourceBuilder.create().build();
    }

下面的例子展示了如何通过设置属性来定义JDBC数据源:

app:
  datasource:
    url: "jdbc:mysql://localhost/test"
    username: "dbuser"
    password: "dbpass"
    pool-size: 30

然而,这里有一个陷阱。由于没有公开数据库连接池的实际类型,因此在自定义DataSource的元数据中没有生成键,IDE中也没有可用的键选择,因为DataSource接口没有公开属性。
另外,如果类路径上碰巧有Hikari,这个基本设置就不起作用了,因为Hikari没有url属性(但有一个jdbcUrl属性)。在这种情况下,你必须重写你的配置如下:

app:
  datasource:
    jdbc-url: "jdbc:mysql://localhost/test"
    username: "dbuser"
    password: "dbpass"
    pool-size: 30

下面的例子展示了如何使用DataSourceBuilder创建HikariDataSource:

@Configuration(proxyBeanMethods = false)
public class MyDataSourceConfiguration {

    @Bean
    @ConfigurationProperties("app.datasource")
    public HikariDataSource dataSource() {
        return DataSourceBuilder.create().type(HikariDataSource.class).build();
    }

}

你甚至可以进一步利用DataSourceProperties为你做的事情—也就是说,如果没有提供URL,则通过提供用户名和密码的默认嵌入式数据库。 你可以很容易地从任何DataSourceProperties对象的状态初始化一个DataSourceBuilder,所以你也可以注入Spring Boot自动创建的DataSource。 然而,这将把你的配置分成两个名称空间:spring.datasource上的url,username, password, type, 和 driver其余的在你自定义的命名空间上(app.datasource)。 为了避免这种情况,你可以在你的自定义名称空间上重新定义一个自定义DataSourceProperties,如下面的示例所示:

@Configuration(proxyBeanMethods = false)
public class MyDataSourceConfiguration {

    @Bean
    @Primary
    @ConfigurationProperties("app.datasource")
    public DataSourceProperties dataSourceProperties() {
        return new DataSourceProperties();
    }

    @Bean
    @ConfigurationProperties("app.datasource.configuration")
    public HikariDataSource dataSource(DataSourceProperties properties) {
        return properties.initializeDataSourceBuilder().type(HikariDataSource.class).build();
    }

}

这个设置与Spring Boot默认为你做的配置同步。

app:
  datasource:
    url: "jdbc:mysql://localhost/test"
    username: "dbuser"
    password: "dbpass"
    configuration:
      maximum-pool-size: 30

总结

数据源自动配置是Spring Boot自带的DataSourceAutoConfiguration

spring.application.name=demo server.port=8080 # 数据库连接配置 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/parking_port1?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai spring.datasource.username=root spring.datasource.password=123456 mybatis-plus.configuration.database-id=mysql spring.sql.init.mode=always mybatis-plus.type-aliases-package=com.example.demo.entity mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl mybatis-plus.configuration.default-enum-type-handler=com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler jwt.secret=VGhpcyBpcyBhIHN1cGVyIHNlY3JldCBrZXkgZm9yIEpXVCAxMjM0NTY3ODkwCg== jwt.access-token-expire=3600000 jwt.refresh-token-expire=2592000000 # 显示 SQL 便于调试 spring.jpa.show-sql=true # 格式化 SQL spring.jpa.properties.hibernate.format_sql=true mybatis-plus.mapper-locations=classpath:mapper/**.xml # 头像上传配置 upload.avatar.path=/usr/local/upload/avatars upload.avatar.url-prefix=/api/avatars/ spring.data.redis.host=localhost spring.data.redis.port=6379 spring.data.redis.database=0 spring.data.redis.timeout=10000ms spring.data.redis.lettuce.pool.max-active=8 spring.data.redis.lettuce.pool.max-idle=8 spring.data.redis.lettuce.pool.min-idle=2 spring.data.redis.lettuce.pool.max-wait=1000ms logging.level.org.springframework.security=DEBUG logging.level.org.springframework.web=DEBUGDatabase JDBC URL [Connecting through datasource &#39;HikariDataSource (HikariPool-1)&#39;] Database driver: undefined/unknown Database version: 8.0.30 Autocommit mode: undefined/unknown Isolation level: undefined/unknown Minimum pool size: undefined/unknown Maximum pool size: undefined/unknown
最新发布
08-12
配置 Spring Boot 应用的数据库连接和相关组件时,通常需要进行以下几个方面的设置: ### 数据库连接配置 Spring Boot 提供了便捷的数据库连接方式,主要通过 `application.properties` 或 `application.yml` 文件进行配置。默认情况下,Spring Boot 使用 `HikariCP` 作为数据库连接池,但也可以选择其他连接池如 `Tomcat JDBC` 或 `Commons DBCP2`。 #### 使用 `application.properties` 配置数据库连接: ```properties spring.datasource.url=jdbc:mysql://localhost:3306/your_database spring.datasource.username=your_username spring.datasource.password=your_password spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver ``` #### 使用 `application.yml` 配置数据库连接: ```yaml spring: datasource: url: jdbc:mysql://localhost:3306/your_database username: your_username password: your_password driver-class-name: com.mysql.cj.jdbc.Driver ``` 如果需要自定义连接池配置,例如设置最大连接数、连接超时时间等,可以添加如下配置: ```properties spring.datasource.hikari.maximum-pool-size=10 spring.datasource.hikari.connection-timeout=30000 spring.datasource.hikari.idle-timeout=600000 spring.datasource.hikari.max-lifetime=1800000 ``` ### JPA 配置 如果使用 Spring Data JPA 进行数据访问,还需要配置 JPA 的相关属性,例如实体管理器、DDL 自动更新等: ```properties spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect spring.jpa.properties.hibernate.format_sql=true ``` ### 数据源初始化 在某些情况下,可能需要在应用启动时初始化数据库,可以通过以下配置启用 schema 和 data 的初始化: ```properties spring.datasource.initialization-mode=always spring.sql.init.schema-locations=classpath:schema.sql spring.sql.init.data-locations=classpath:data.sql ``` ### 多数据源配置 当需要配置多个数据源时,可以通过自定义配置类来定义多个 `DataSource` Bean。例如: ```java @Configuration public class MultiDataSourceConfig { @Bean(name = "primaryDataSource") @ConfigurationProperties(prefix = "spring.datasource.primary") public DataSource primaryDataSource() { return DataSourceBuilder.create().build(); } @Bean(name = "secondaryDataSource") @ConfigurationProperties(prefix = "spring.datasource.secondary") public DataSource secondaryDataSource() { return DataSourceBuilder.create().build(); } } ``` 对应的 `application.properties` 配置如下: ```properties spring.datasource.primary.url=jdbc:mysql://localhost:3306/primary_db spring.datasource.primary.username=root spring.datasource.primary.password=root spring.datasource.primary.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.secondary.url=jdbc:mysql://localhost:3306/secondary_db spring.datasource.secondary.username=root spring.datasource.secondary.password=root spring.datasource.secondary.driver-class-name=com.mysql.cj.jdbc.Driver ``` ### 安全性与健康检查 为了确保数据库连接的稳定性和安全性,Spring Boot 还提供了健康检查功能。可以通过以下配置启用数据库健康检查: ```properties management.health.db.enabled=true ``` ### 监控与指标 如果集成了 `Spring Boot Actuator`,可以通过 `/actuator/metrics` 端点监控数据库连接池的状态: ```properties management.endpoints.web.exposure.include=* ``` ### 示例依赖配置 在 `pom.xml` 中引入必要的依赖,例如 MySQL 驱动和 Spring Data JPA: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> ``` ### 总结 通过上述配置,可以轻松实现 Spring Boot 应用的数据库连接和相关组件的设置。根据具体需求,可以选择不同的连接池、配置 JPA、支持多数据源,并通过 Actuator 提供的端点监控数据库状态。这些配置不仅简化了开发流程,还提高了应用的可维护性和扩展性[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

laopeng301

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值