Spring Boot连接PostgreSQL后启动立即关闭问题求助
问题:Spring Boot + PostgreSQL 应用启动后立刻关闭
我是Spring Boot和PostgreSQL新手,尝试连接两者时,应用启动流程看似正常,日志显示成功初始化JPA EntityManagerFactory,但启动后立刻关闭,无法持续运行。以下是相关详情:
application.properties
spring.datasource.url=jdbc:postgresql://localhost:5432/dbname spring.datasource.username=username spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect spring.jpa.hibernate.ddl-auto=create spring.jpa.show-sql=true spring.jpa.properties.hibernate.format_sql=true
Model:Product.java
import jakarta.persistence.Entity; import jakarta.persistence.Id; import java.math.BigDecimal; import java.time.LocalDateTime; @Entity public class Product { @Id private Long id; private String sku; private String name; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getSku() { return sku; } public void setSku(String sku) { this.sku = sku; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
启动日志
2023-10-29T01:25:19.851+04:00 INFO 78086 --- [ main] c.s.s.SpringDataJpaCourseApplication : Starting SpringDataJpaCourseApplication using Java 17.0.7 with PID 78086 (/Users/keerthana/Downloads/spring-data-jpa-course/target/classes started by keerthana in /Users/keerthana/Downloads/spring-data-jpa-course) 2023-10-29T01:25:19.853+04:00 INFO 78086 --- [ main] c.s.s.SpringDataJpaCourseApplication : No active profile set, falling back to 1 default profile: "default" 2023-10-29T01:25:20.043+04:00 INFO 78086 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. 2023-10-29T01:25:20.052+04:00 INFO 78086 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 5 ms. Found 0 JPA repository interfaces. 2023-10-29T01:25:20.206+04:00 INFO 78086 --- [ main] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] 2023-10-29T01:25:20.234+04:00 INFO 78086 --- [ main] org.hibernate.Version : HHH000412: Hibernate ORM core version 6.2.13.Final 2023-10-29T01:25:20.235+04:00 INFO 78086 --- [ main] org.hibernate.cfg.Environment : HHH000406: Using bytecode reflection optimizer 2023-10-29T01:25:20.363+04:00 INFO 78086 --- [ main] o.s.o.j.p.SpringPersistenceUnitInfo : No LoadTimeWeaver setup: ignoring JPA class transformer 2023-10-29T01:25:20.376+04:00 INFO 78086 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... 2023-10-29T01:25:20.441+04:00 INFO 78086 --- [ main] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Added connection org.postgresql.jdbc.PgConnection@74f827ad 2023-10-29T01:25:20.442+04:00 INFO 78086 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. 2023-10-29T01:25:20.467+04:00 WARN 78086 --- [ main] org.hibernate.orm.deprecation : HHH90000025: PostgreSQLDialect does not need to be specified explicitly using 'hibernate.dialect' (remove the property setting and it will be selected by default) 2023-10-29T01:25:20.832+04:00 INFO 78086 --- [ main] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) Hibernate: drop table if exists product cascade 2023-10-29T01:25:20.842+04:00 WARN 78086 --- [ main] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Warning Code: 0, SQLState: 00000 2023-10-29T01:25:20.842+04:00 WARN 78086 --- [ main] o.h.engine.jdbc.spi.SqlExceptionHelper : table "product" does not exist, skipping Hibernate: create table product ( id bigint not null, name varchar(255), sku varchar(255), primary key (id) ) 2023-10-29T01:25:20.874+04:00 INFO 78086 --- [ main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' 2023-10-29T01:25:20.933+04:00 INFO 78086 --- [ main] c.s.s.SpringDataJpaCourseApplication : Started SpringDataJpaCourseApplication in 1.249 seconds (process running for 1.5) 2023-10-29T01:25:20.935+04:00 INFO 78086 --- [ionShutdownHook] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default' 2023-10-29T01:25:20.936+04:00 INFO 78086 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... 2023-10-29T01:25:20.938+04:00 INFO 78086 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed. Process finished with exit code 0
pom.xml
<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.postgresql</groupId> <artifactId>postgresql</artifactId> <version>42.6.0</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot</artifactId> <version>3.1.3</version> </dependency> </dependencies>
问题原因及解决方案
核心原因
你的Spring Boot应用没有添加能让应用保持运行的核心依赖。当前pom.xml中只有JPA、数据库驱动、测试依赖和基础Spring Boot核心,这些组件在完成初始化后没有需要持续运行的服务(比如Web容器),所以Spring Boot会自动关闭上下文,进程随之终止。
解决方案
方案1:添加Web Starter依赖(最常用)
如果你的应用是Web服务,直接在pom.xml的<dependencies>中添加spring-boot-starter-web依赖,它会引入Tomcat容器,让应用以Web服务形式持续运行:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
方案2:非Web应用保持运行(如果不需要Web服务)
如果你的应用不需要Web功能,只是后台任务或数据操作,可以通过以下方式让进程保持存活:
- 添加
spring-boot-starter依赖(替代单独的spring-boot依赖):
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency>
- 或者实现
CommandLineRunner接口,并在run方法中让主线程等待:
import org.springframework.boot.CommandLineRunner; import org.springframework.stereotype.Component; @Component public class KeepAliveRunner implements CommandLineRunner { @Override public void run(String... args) throws InterruptedException { Thread.currentThread().join(); } }
额外优化建议
从日志中的警告可以看到,PostgreSQLDialect不需要显式配置,Hibernate会自动根据数据源选择合适的方言,建议移除application.properties中的以下配置:
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
内容的提问来源于stack exchange,提问作者keeru
相关产品推荐
相关产品推荐

