You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 14:27:33