SpringBoot配置MySQL异常:错误凭据/端口仍能正常启动
问题:Spring Boot配置错误数据库信息仍能启动,且不生成表
我通过start.spring.io创建了一个Spring Boot应用,配置spring-data-jpa相关属性后,应用可正常启动,但本地数据库中未生成任何表。为进一步测试,我在application.properties中配置了错误的数据库凭据,甚至修改了错误的端口,预期应用启动失败,但它仍能正常启动。日志显示应用正在连接MySQL数据库,但我不清楚它连接的是哪个数据库以及如何连接的。
application.properties配置
spring.datasource.url = jdbc:mysql://localhost:3306/db spring.datasource.username = db spring.datasource.password = pass spring.datasource.driver-class-name=com.mysql.jdbc.Driver # Keep the connection alive if idle for a long time (needed in production) spring.datasource.testWhileIdle = true spring.datasource.validationQuery = SELECT 1 # Show or not log for each sql query spring.jpa.show-sql = true # Hibernate ddl auto (create, create-drop, update) spring.jpa.hibernate.ddl-auto = update # Naming strategy spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy # Use spring.jpa.properties.* for Hibernate native properties (the prefix is # stripped before adding them to the entity manager) # The SQL dialect makes Hibernate generate better SQL for the chosen database spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
pom.xml配置
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.4</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>demo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>demo</name> <properties> <java.version>17</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
应用启动日志(配置错误端口时)
. ____ _ __ _ _ /\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.7.4) 2022-10-01 22:01:21.025 INFO 20928 --- [ main] com.example.demo.DemoApplication : Starting DemoApplication using Java 16.0.2 on DESKTOP-S112VSS with PID 20928 (C:\Users\Paras\Downloads\demo\demo\target\classes started by Paras in C:\Users\Paras\Downloads\demo\demo) 2022-10-01 22:01:21.036 INFO 20928 --- [ main] com.example.demo.DemoApplication : No active profile set, falling back to 1 default profile: "default" 2022-10-01 22:01:22.278 INFO 20928 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. 2022-10-01 22:01:22.302 INFO 20928 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 9 ms. Found 0 JPA repository interfaces. 2022-10-01 22:01:23.557 INFO 20928 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) 2022-10-01 22:01:23.583 INFO 20928 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] 2022-10-01 22:01:23.584 INFO 20928 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.65] 2022-10-01 22:01:23.957 INFO 20928 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext 2022-10-01 22:01:23.957 INFO 20928 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 2789 ms 2022-10-01 22:01:24.267 INFO 20928 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... 2022-10-01 22:01:24.524 INFO 20928 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. 2022-10-01 22:01:24.600 INFO 20928 --- [ main] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] 2022-10-01 22:01:24.697 INFO 20928 --- [ main] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.6.11.Final 2022-10-01 22:01:24.971 INFO 20928 --- [ main] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final} 2022-10-01 22:01:25.150 INFO 20928 --- [ main] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.MySQL8Dialect 2022-10-01 22:01:25.472 INFO 20928 --- [ main] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform] 2022-10-01 22:01:25.489 INFO 20928 --- [ main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' 2022-10-01 22:01:25.550 WARN 20928 --- [ main] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning 2022-10-01 22:01:26.069 INFO 20928 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' 2022-10-01 22:01:26.086 INFO 20928 --- [ main] com.example.demo.DemoApplication : Started DemoApplication in 5.957 seconds (JVM running for 6.799)
问题分析与解决方案
核心原因
无JPA实体类映射
日志中明确显示Found 0 JPA repository interfaces,且如果没有定义任何标注@Entity的实体类,Hibernate没有需要映射的对象,自然不会生成数据库表。Hikari连接池懒加载机制
Hikari连接池默认不会在应用启动时立即建立数据库连接,只有当实际执行数据库操作(比如调用Repository方法)时才会尝试连接。这就导致即使配置了错误的端口或凭据,启动阶段也不会触发连接验证,应用能正常启动,直到首次数据库操作才会报错。
解决步骤
添加JPA实体类
创建一个标注@Entity的实体类,示例代码:package com.example.demo.entity; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; @Entity public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String username; private String email; // 构造方法、getter、setter方法 }强制启动时验证连接
在application.properties中添加以下配置,让Hikari在启动时立即验证数据库连接,错误配置会直接导致启动失败:spring.datasource.hikari.initialization-fail-timeout=5000修正过时配置项
Spring Boot 2.x中spring.jpa.hibernate.naming-strategy已被废弃,替换为:spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl # 或根据需求使用其他策略
内容的提问来源于stack exchange,提问作者Paras
相关产品推荐
相关产品推荐

