1. 概述
在这个教程中,我们将学习如何在不依赖运行数据库的情况下启动Spring Boot应用。
默认情况下,如果我们的Spring Boot应用包含Spring Data JPA,那么应用会自动尝试建立数据库连接。但在应用启动时没有数据库可用的情况下,可能需要避免这种情况。
2. 设置
我们将使用一个简单的Spring Boot应用,它使用MySQL。让我们来看看设置应用的步骤。
2.1. 依赖项
在pom.xml
文件中添加Spring Data JPA启动器和MySQL连接器依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
这将JPA、MySQL连接器和Hibernate添加到类路径中。
此外,我们希望在应用启动时有一个任务持续运行。为此,我们在pom.xml
文件中添加Web启动器:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
这会在8080端口启动一个web服务器并保持应用运行。
2.2. 配置
在启动应用之前,我们需要在application.properties
文件中设置一些必备的属性:
spring.datasource.url=jdbc:mysql://localhost:3306/myDb
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect
让我们理解我们设置的属性:
-
spring.datasource.url
: 数据库服务器的URL和数据库名称。 -
spring.datasource.driver-class-name
: 驱动程序类名。MySQL连接器提供了这个驱动。 -
spring.jpa.properties.hibernate.dialect
: 我们设置为MySQL,告诉JPA提供者使用MySQL方言。
除了这些,还需要设置连接数据库所需的用户名和密码:
spring.datasource.username=root
spring.datasource.password=root
2.3. 启动应用
如果我们启动应用,会看到以下错误:
HHH000342: Could not obtain connection to query metadata
com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
这是因为指定的URL处没有运行数据库服务器。然而,应用的默认行为是执行以下操作:
- JPA尝试连接到数据库服务器并获取元数据
- Hibernate如果不存在,会尝试创建数据库。 这是因为默认情况下
spring.jpa.hibernate.ddl-auto
属性设置为create
。
3. 不依赖数据库运行
为了继续而无需数据库,我们需要覆盖上述两个默认行为。
首先,禁用元数据获取:
spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults=false
然后,禁用自动数据库创建:
spring.jpa.hibernate.ddl-auto=none
通过设置这个属性,我们已禁用了数据库的创建。因此应用没有理由建立连接。
现在,当我们启动应用时,它不会出现任何错误。除非有与数据库交互的操作,否则不会发起连接。
4. 总结
在这篇文章中,我们了解了如何在不需要运行数据库的情况下启动Spring Boot应用。
我们研究了应用的默认行为,即寻找数据库连接。然后我们通过覆盖两个属性来修复了默认行为。
如往常一样,本文中的代码示例可在GitHub上找到。