Scala Play Framework连接PostgreSQL数据库失败求助
解决Play 2.8.2后端连接Docker Compose部署的PostgreSQL时的连接拒绝问题
我来帮你一步步排查解决这个连接拒绝的问题——核心原因其实是Docker Compose容器间的网络访问逻辑,外加一些依赖和启动顺序的小细节,咱们逐个解决:
1. 修正数据库连接地址(最关键的一步)
你现在用的127.0.0.1是指Play后端容器自己的本地回环,而不是宿主机或者PostgreSQL容器的地址!在Docker Compose的默认网络里,每个服务都可以直接用服务名作为主机名来访问,所以你需要把连接字符串改成:
val connection= DriverManager.getConnection("jdbc:postgresql://database:5432/smartmarkt", "postgres", "postgres")
这里的database就是你docker-compose.yml里PostgreSQL服务的名称,Docker会自动把这个名称解析到对应容器的IP地址,这样后端容器就能直接访问到数据库容器了。
2. 确保PostgreSQL驱动依赖正确生效
手动把jar包丢到/lib目录容易出现依赖冲突或者sbt没识别的问题,建议用sbt的依赖管理来配置:
在你的build.sbt里明确添加驱动依赖:
libraryDependencies ++= Seq( jdbc, // Play的JDBC支持 "org.postgresql" % "postgresql" % "42.2.13" // 你用的版本,也可以换成最新稳定版 )
然后运行sbt clean update让sbt重新拉取依赖,之后把/lib目录下的postgresql-42.2.13.jar删掉,避免冲突。
3. 确保数据库完全就绪后再启动后端
depends_on只是保证启动顺序,不保证数据库已经完成初始化可以接受连接。给PostgreSQL服务加上健康检查,让后端等数据库真正就绪后再启动:
修改你的docker-compose.yml:
services: web: build: frontend/ ports: - "80:80" links: - api database: image: "postgres" ports: - "5432:5432" environment: - POSTGRES_DB=smartmarkt - POSTGRES_PASSWORD=postgres - POSTGRES_USER=postgres volumes: - ./init.sql:/docker-entrypoint-initdb.d/init.sql healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres -d smartmarkt"] interval: 5s timeout: 5s retries: 5 api: build: backend/ ports: - "8080:8080" depends_on: database: condition: service_healthy
这样后端容器只会在数据库通过健康检查(能正常接受连接)之后才启动,避免启动时数据库还没准备好导致连接失败。
4. 快速排查网络连通性的小技巧
如果还是有问题,可以进入后端容器内部测试网络:
- 先找到后端容器的名称:
docker ps,找到api服务对应的容器名 - 进入容器:
docker exec -it <你的api容器名> /bin/bash - 尝试ping数据库服务:
ping database,如果能ping通说明网络没问题 - 如果容器里没有psql,可以临时安装:
apt update && apt install postgresql-client -y,然后直接测试连接:psql -h database -U postgres -d smartmarkt,输入密码postgres,如果能连上说明数据库配置没问题
内容的提问来源于stack exchange,提问作者Proxy
相关产品推荐
相关产品推荐

