程序员的资源宝库

网站首页 > gitee 正文

Spring Boot笔记 #06# Data(spring boot datasource配置)

sanyeah 2024-04-01 11:33:31 gitee 6 ℃ 0 评论

翻译自:https://docs.spring.io/spring-boot/docs/current/reference/html/data.html#data.sql

Spring Boot集成了许多数据技术,包括SQL和NoSQL。

1. SQL Databases

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

1.1. Configure a DataSource

Java的javax.sql.DataSource接口提供了处理数据库连接的标准方法。传统上,一个'DataSource'使用一个URL和一些凭据来建立数据库连接。

更多高级示例,请参见“如何”部分,这些示例通常用于完全控制数据源的配置。

1.1.1. 嵌入式数据库支持

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

“如何”部分包括一个关于如何初始化数据库的部分。

Spring Boot可以自动配置嵌入式H2HSQLDerby数据库。您不需要提供任何连接URL。您只需要包含对要使用的嵌入式数据库的构建依赖项。如果类路径上有多个嵌入式数据库,请设置spring.datasource.embedded-database-connection属性来控制使用哪个数据库。将属性设置为“none”将禁用嵌入式数据库的自动配置。

例如,典型的POM依赖关系如下:

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

要自动配置嵌入式数据库,需要依赖spring-jdbc。在本例中,它通过spring-boot-starter-data-jpa传递地被拉取引入。

无论出于何种原因,如果确实为嵌入式数据库配置了连接URL,请务必确保禁用数据库的自动关闭(the database’s automatic shutdown)。如果使用H2,那么应该使用DB_CLOSE_ON_EXIT=FALSE。如果使用HSQLDB,应确保使用shutdown=true。禁用数据库的自动关闭可以让Spring在数据库关闭时进行引导控制,从而确保一旦不再需要访问数据库,就会发生这种情况。

1.1.2. Connection to a Production Database

还可以使用池数据源(a pooling DataSource)自动配置生产数据库连接(Production database connections)

1.1.3. DataSource Configuration

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

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

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

对于要创建的池数据源,我们需要能够验证有效的驱动程序类是否可用,所以我们在做任何事情之前都要检查它。换句话说,如果设置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
spring.datasource.tomcat.max-active=50
spring.datasource.tomcat.test-on-borrow=true

如果没有可用的连接,将连接池设置为在抛出异常之前等待10000ms,将最大连接数限制为50,并在从连接池借用连接之前验证连接。

1.1.4. Supported Connection Pools

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

我们更喜欢HikariCP的性能和并发性。如果HikariCP可用,我们总是选择它。

否则,如果Tomcat池数据源可用,我们就使用它。

否则,如果Commons DBCP2可用,我们就使用它。

如果HikariCP、Tomcat和DBCP2都不可用,如果Oracle UCP可用,我们就使用它。

如果使用spring-boot-starter-jdbcspring-boot-starter-data-jpa “starters”则会自动获得对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

1.3. JPA and Spring Data JPA

Java持久性API(The Java Persistence API)是一种标准技术,允许您将对象“映射”到关系数据库。spring-boot-starter-data-jpa POM提供了快速入门的方法。它提供了以下关键依赖项:

  • Hibernate:最流行的JPA实现之一。
  • Spring Data JPA:帮助您实现基于JPA的存储库。
  • Spring ORM:Spring框架的核心ORM支持。

我们在这里不讨论JPA或Spring Data的太多细节。您可以遵循https://spring.io/的“使用JPA访问数据”指南,并阅读Spring Data JPA和Hibernate参考文档。

1.3.1. Entity Classes

传统上,JPA“实体”类是在persistence.xml文件中指定的。在Spring Boot中,不需要这个文件,而是使用“实体扫描(Entity Scanning)”。默认情况下,将搜索主配置类(用@EnableAutoConfiguration或@SpringBootApplication注释的配置类)下的所有包。

任何带有@Entity、@Embeddeble或@MappedSuperclass注释的类都会被考虑。典型的实体类类似于以下示例:

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class City implements Serializable {

    @Id
    @GeneratedValue
    private Long id;

    @Column(nullable = false)
    private String name;

    @Column(nullable = false)
    private String state;

    // ... additional members, often include @OneToMany mappings

    protected City() {
        // no-args constructor required by JPA spec
        // this one is protected since it should not be used directly
    }

    public City(String name, String state) {
        this.name = name;
        this.state = state;
    }

    public String getName() {
        return this.name;
    }

    public String getState() {
        return this.state;
    }

    // ... etc

}

您可以使用@EntityScan注释自定义实体扫描位置。请参阅“howto.html”操作指南。

1.3.2. Spring Data JPA Repositories

Spring Data JPA存储库是可以定义用于访问数据的接口。JPA查询是根据方法名自动创建的。例如,CityRepository接口可能会声明一个findAllByState(字符串状态)方法来查找给定状态下的所有城市。

对于更复杂的查询,可以使用Spring Data的Query注解对方法进行注释。

Spring Data存储库通常从Repository或CrudRepository接口扩展而来。如果使用自动配置,存储库将从包含主配置类(用@EnableAutoConfiguration@SpringBootApplication注释的配置类)的包中向下搜索。

以下示例显示了一个典型的Spring Data存储库接口定义:

import org.springframework.boot.docs.data.sql.jpaandspringdata.entityclasses.City;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.repository.Repository;

public interface CityRepository extends Repository<City, Long> {

    Page<City> findAll(Pageable pageable);

    City findByNameAndStateAllIgnoringCase(String name, String state);

}

Spring Data JPA存储库支持三种不同的引导模式:默认、延迟和懒惰。要启用延迟或懒惰引导,请将spring.data.jpa.repositories.bootstrap-mode属性分别设置为deferred或者lazy。使用延迟或懒惰引导时,自动配置的EntityManagerFactoryBuilder将使用上下文的AsyncTaskExecutor(如果有)作为引导执行器。如果存在多个,将使用名为applicationTaskExecutor的。

我们仅仅触及了Spring Data JPA的皮毛。要了解完整的细节,请参阅Spring Data JPA参考文档。

1.5. Using H2’s Web Console

H2数据库提供了一个基于浏览器的控制台,Spring Boot可以为您自动配置。当满足以下条件时,控制台将自动配置:

  • 您正在开发一个基于servlet的web应用程序。
  • com.h2database:h2在类路径上。
  • 您正在使用Spring Boot的开发工具(Spring Boot’s developer tools)。

如果您没有使用Spring Boot的开发工具,但仍然希望使用H2的控制台,那么可以将spring.h2.console.enabled属性的值配置为true。

H2控制台仅用于开发过程中,因此您应该注意确保spring.h2.console.enabled在生产环境中未设置为true。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表