【问题标题】:How to connect to a Postgres on Docker using java.sql package?如何使用 java.sql 包连接到 Docker 上的 Postgres?
【发布时间】:2019-10-29 23:46:24
【问题描述】:

如何使用java.sql. 模块连接到 PostgreSQL 数据库(在 Docker 容器内)?

我已经在运行 Postgres 并使用带有此配置的 pgadmin 访问它:

version: '3'

services:
  teste-postgres-compose:
    image: postgres
    environment:
      POSTGRES_PASSWORD: "Postgres2019!"
    ports:
      - "15432:5432"
    volumes:
      - /home/renatogroffe/Desenvolvimento/Docker-Compose/PostgreSQL:/var/lib/postgresql/data 
    networks:
      - postgres-compose-network

  teste-pgadmin-compose:
    image: dpage/pgadmin4
    environment:
      PGADMIN_DEFAULT_EMAIL: "admin@admin.com.br"
      PGADMIN_DEFAULT_PASSWORD: "PgAdmin2019!"
    ports:
      - "16543:80"
    depends_on:
      - teste-postgres-compose
    networks:
      - postgres-compose-network

networks: 
  postgres-compose-network:
    driver: bridge

但如果我尝试通过我的 Java 应用程序连接,我会收到错误消息:

org.postgresql.util.PSQLException:连接尝试失败。

这是我试图调用的连接:

try{
    Class.forName("org.postgresql.Driver");            
    connection = DriverManager.getConnection("jdbc:postgresql://teste-postgres-compose:15432/postgres", "postgres", "Postgres2019!");
} catch(ClassNotFoundException erro1){
    throw new RuntimeException(erro1);
} catch (SQLException erro2) {
    throw new RuntimeException(erro2);
}

return connection;

【问题讨论】:

    标签: java postgresql docker


    【解决方案1】:

    在您的配置中发现 2 个错误输入

    services:
      teste-postgres-compose:
        image: postgres
        environment:
          POSTGRES_PASSWORD: "Postgres2019!"
        ports:
          - "15432:5432"
    
    connection = DriverManager.getConnection("jdbc:postgresql://test-postgres-compose:5432/postgres", "postgres", "Postgres2019!");
    
    1. 您的服务名称为teste-postgres-compose,但您连接到test-postgres-compose
    2. - "15432:5432" 你暴露了端口15432 但连接到5432

    更新:

    对不起,我的错。当然,第二个容器是 pgadmin,而不是你的应用程序。

    teste-postgres-compose 等容器的名称仅在 postgres-compose-network 网络中可用,并且可以被同一网络中的其他容器使用。应用程序在本地启动(我猜您是从 IDE 启动的 java 代码)可能只使用带有 localhost 的公开端口。服务的名称在网络之外不可用。

    例如,您的 postgres 必须通过地址提供:

    本地主机:15432

    因为您已在撰写文件中公开了此端口。您也可以尝试回送127.0.0.1 或您的主机IP 地址。

    【讨论】:

    • 对不起,我可能写错了。我正在使用conexao = DriverManager.getConnection("jdbc:postgresql://teste-postgres-compose:15432/postgres", "postgres", "Postgres2019!");,但仍然遇到同样的错误。
    猜你喜欢
    • 2019-04-22
    • 2019-08-15
    • 1970-01-01
    • 2020-08-26
    • 1970-01-01
    • 2018-07-24
    • 2021-12-23
    • 1970-01-01
    • 2020-12-10
    相关资源
    最近更新 更多