我无法使用 Spring JPA 将我的 Spring Boot 应用程序连接到 PostgreSQL 数据库。
下面是我的 application.yaml 文件。
spring:
application:
name: jaah
datasource:
url: jdbc:postgresql://db:5432/taah
username: waah
password: blah
driverClassName: org.postgresql.Driver
jpa:
database-platform: org.hibernate.dialect.PostgreSQLDialect
hibernate:
ddl-auto: update
properties:
hibernate:
dialect: org.hibernate.dialect.PostgreSQLDialect
ddl-auto: none
boot:
'[allow_jdbc_metadata_access]': false
sql:
init:
mode: never
main:
allow-bean-definition-overriding: true
logging:
level:
org:
hibernate: DEBUG
server:
port: 8080
address: 0.0.0.0
下面是 docker compose.yaml 文件。数据库托管在容器内部的 5432 柱上,以及外部的 5434 柱上。
db:
image: postgres
container_name: db
ports:
- 5434:5432
restart: always
env_file:
- .env
volumes:
- postgresdata:/var/lib/postgresql/data
environment:
- POSTGRES_DB=taah
- POSTGRES_USER=waah
- PGUSER=waah
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD} #from env
healthcheck:
test: ["CMD-SHELL","psql -h localhost -U $${POSTGRES_USER} -c select 1 -d $${POSTGRES_DB}"]
interval: 10s
timeout: 5s
retries: 5
networks:
- mynetwork
spring_boot_server:
image: backend
build: .
depends_on:
db:
condition: service_healthy
ports:
- "8080:8080"
networks:
- mynetwork
environment:
- SERVER_PORT=8080
networks:
mynetwork:
driver: bridge
下面我的DockerFile
FROM openjdk:21
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]
当我分别运行 docker compose 和服务器时,即当我运行 postgres docker 容器,然后 spring 应用程序在端口 5434 连接到数据库时,该应用程序工作。
这是服务器启动前的最后一条消息
db | 2024-09-15 11:14:15.980 UTC [1] LOG: database system is ready to accept connections
I bash'd into the postgres container sudo docker exec -it db /bin/sh
psql -h db -p 5432 -U waah -d taah Password for user waah:
waah=# \dt Did not find any relations.
这是在我使用
重新启动容器之后我还将数据库网址更改为
jdbc:postgresql://localhost:5432/taah
但没有任何效果
我的环境:
version: '3.3' # Add version
services: # Add services
db:
image: postgres
container_name: db
ports:
- 5432:5432
restart: always
env_file:
- .env
volumes:
- postgresdata:/var/lib/postgresql/data
environment:
- POSTGRES_DB=taah
- POSTGRES_USER=waah
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD} #from env
#- PGUSER=waah # Remove PGUSER
healthcheck:
test: ["CMD-SHELL","psql -h localhost -U $${POSTGRES_USER} -c select 1 -d $${POSTGRES_DB}"]
interval: 10s
timeout: 5s
retries: 5
networks:
- mynetwork
spring_boot_server:
image: backend
build: .
depends_on:
- db
# Remove condition: service_healthy
ports:
- "8080:8080"
networks:
- mynetwork
environment:
- SERVER_PORT=8080
networks:
mynetwork:
driver: bridge
volumes:
postgresdata:
version
:version: '3.3'
services:
#- PGUSER=waah
port 5432:5432
condition: service_healthy
depends_on:
- db