【问题标题】:Npgsql Connection Timeout with Postgres Running in Docker Container在 Docker 容器中运行 Postgres 的 Npgsql 连接超时
【发布时间】:2021-07-12 20:22:40
【问题描述】:

我正在尝试在 .NET 5 控制台应用程序中使用 Npgsql 连接到我的 Postgres 数据库。 Postgres 数据库在 Docker 容器中运行。我已经使用 Azure Data Studio 连接到数据库一段时间了,没有任何问题,所以我有点不确定我在从这个应用程序连接时做错了什么。

调用NpgsqlConnection.Open()时,会抛出System.Timeout异常。

System.Private.CoreLib.dll 中出现“Npgsql.NpgsqlException”类型的未处理异常:“连接时出现异常” 发现内部异常,请参阅变量窗口中的 $exception 了解更多详细信息。 最里面的异常 System.TimeoutException : 连接尝试超时 在 Npgsql.NpgsqlConnector.Connect(NpgsqlTimeout 超时)

我已确认运行我的 Postgres 数据库的 Docker 容器正在运行,并且我可以从 Azure Data Studio 和 PGAdmin 成功连接和查询它。

这是我的控制台应用程序中的代码。我已经编辑了连接字符串中的值,并多次检查了这些值,以确保它们与我在 Azure Data Studio 和 PGAdmin 中用于连接的值相同。我也尝试在连接字符串中包含特定的数据库名称,但结果是相同的System.Timeout 异常。

我正在使用 Npgsql 版本 5.0.4。

using Dapper;
using Npgsql;

namespace EplStats
{
    class Program
    {
        static void Main(string[] args)
        {
            var connStr = "Host={host};Port=5433;Username={usr};Password={pwd};";
            using (var conn = new NpgsqlConnection(connStr))
            {
                conn.Open();
                var test = conn.Query("select * from epl.teams;");
            }
        }
    }
}

这是我用于 Postgres 和 PGAdmin 的 docker-compose.yml

version: "3.9"

services:
  postgres-db:
    image: postgres:13
    environment:
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
    ports:
      - "5433:5432"
    networks:
      - pg_network
    volumes:
      - db_data:/var/lib/postgresql/data

  pgadmin4:
    image: dpage/pgadmin4
    environment:
      PGADMIN_DEFAULT_EMAIL: ${PGADMIN_DEFAULT_EMAIL}
      PGADMIN_DEFAULT_PASSWORD: ${POSTGRES_PASSWORD}
    ports:
      - "8088:80"
    networks:
      - pg_network

networks:
  pg_network:
    driver: bridge

volumes:
  db_data:

我觉得我在这里遗漏了一些明显的东西,因为从控制台应用程序打开连接的代码相对简单。

【问题讨论】:

    标签: postgresql docker .net-core database-connection npgsql


    【解决方案1】:

    我想到的只有两件事:

    docker-compose.yml:

      `POSTGRES_DB: <db_name_here>`
    

    Program.cs 文件中:

        var connStr = "Host={host};Port=5433;Username={usr};Password={pwd};Database=<db_name_here>";
    

    【讨论】:

    • 主机也可以是本地主机
    • 您可以在连接字符串中添加更多参数,例如超时等。
    【解决方案2】:

    不幸的是,我在这里发现了我的问题,而且正如我所预料的那样,这是一件非常微不足道的事情。

    出于某种原因,Azure Data Studio 在其 UI 中删除了我的 Host 值的第一个字符以设置连接。

    例如,如果主机值 182.62.1.27,Azure Data Studio 会在其表单中显示 82.62.1.27 以填写连接详细信息。

    我忽略了 Azure Data Studio 表单 UI 和实际主机 IP 地址之间的这种差异。一旦我在控制台应用程序的连接字符串中设置了正确的主机,我就能够成功连接到数据库。

    【讨论】:

      猜你喜欢
      • 2022-06-10
      • 2021-10-01
      • 2015-01-07
      • 2017-10-31
      • 2021-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-20
      相关资源
      最近更新 更多