装postgresql时为啥连接失败

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了装postgresql时为啥连接失败相关的知识,希望对你有一定的参考价值。

这个是为什么。开始时出现让输入用户的密码,所在服务器。我输了一个第一安装时的password,可是后来就出现这个,而且一直连不上。。。为什么呢?

首先看看 服务器是否启动
控制面板打开【管理工具】【服务】postgresql服务

启动服务后 看下Log
在C:(pastgres安装路径)/data/pg_log/
选择出错误时的时间Log。查看详细信息。

大概是改一下
C:(pastgres安装路径)/data 下的【pg_hba.conf】【postgresql.conf】就可以了
如何去改,在看下log自己查一下吧。
参考技术A 双击那个localhost连接不上是吗?有提示错误信息没追问

连不上呀。出现这个

追答

按2楼的排查下看看

尝试通过 SSH 隧道连接 PostgreSQL 时连接尝试失败。我将 Java 与 jsch lib 一起使用

【中文标题】尝试通过 SSH 隧道连接 PostgreSQL 时连接尝试失败。我将 Java 与 jsch lib 一起使用【英文标题】:The connection attempt failed when try connect PostgreSQL via SSH tunnel. I using Java with jsch lib 【发布时间】:2021-11-22 11:39:48 【问题描述】:

我在成功连接 SSH 后尝试连接到 PostgreSQL 数据库时遇到问题。 我正在使用 Java + JSCH 库来帮助通过 SSH 隧道连接到 DB PostgreSQL。 请帮忙看看我的代码:

public static Connection connectDBAWS(String ipAddress, int port, String dbName, String username, String password, String tunnelHost, int tunnelPort, String tunnelUsername, String tunnelPassword) 

        Connection connection;
        Session session;

        try 

            //SSH TUNNEL connection
            JSch jsch = new JSch();

            session = jsch.getSession(tunnelUsername, tunnelHost, 22);
            session.setPassword(tunnelPassword);
            session.setConfig("StrictHostKeyChecking", "no");
            session.connect();
            System.out.println("Connected Successfully");
            int assinged_port = session.setPortForwardingL(port, tunnelHost, tunnelPort);
            System.out.println("assinged_port -> " + assinged_port);
            System.out.println("Port Forwarded");

            //DB connection
            String dbUrl = "jdbc:postgresql://" + ipAddress + ":" + assinged_port + "/" + dbName;
            Class.forName("org.postgresql.Driver");;
            connection = DriverManager.getConnection(dbUrl, username, password);
            System.out.println("connect DB success");
         catch (Exception e) 
            connection = null;
            e.printStackTrace();
        

        return connection;

     

以下步骤抛出异常:

connection = DriverManager.getConnection(dbUrl, username, password);

结果如下:

Connected Successfully
assinged_port -> 5432
Port Forwarded
org.postgresql.util.PSQLException: The connection attempt failed.
    at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:292)
    at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:49)
    at org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:195)
    at org.postgresql.Driver.makeConnection(Driver.java:454)
    at org.postgresql.Driver.connect(Driver.java:256)
    at java.sql.DriverManager.getConnection(DriverManager.java:664)
    at java.sql.DriverManager.getConnection(DriverManager.java:247)
...

我使用上面的值手动连接PostgreSQL,使用pgAdmin4,并成功连接: See configuration image here.

请有人提供一些修复我的代码的理想方法。

【问题讨论】:

这是完整的异常堆栈跟踪吗?您的代码中的 ipAddress 是什么? 另见Connect to remote MySQL database through SSH using Java。 【参考方案1】:

int assinged_port = session.setPortForwardingL(port, tunnelHost, tunnelPort);

我认为问题在于您不知道这些值的含义。您在错误的地方传递了错误的值。例如,assigned_port 值在这里毫无意义。

L 型端口转发背后的想法是这样的:

本地端口port的连接通过SSH连接到您连接到的服务器... 然后弹出另一侧。然后另一端将连接到主机tunnelHost,端口为tunnelPort,因此转发将继续进行。

鉴于它是这样工作的,名称和值都是错误的。

tunnelPort 肯定是“隧道端口”。换句话说,这是本地端口 - 它应该是传递给 setPortForwardingL第一个 参数,而不是最后一个。 第二个和第三个参数告诉remote SSH 服务器连接什么,完成端口。鉴于您正在通过 SSH 连接到服务器,您不希望服务器随后连接到服务器。这有时有效,但通常无效,这取决于网络会话。你反而想要localhost 那里!请记住,服务器/端口组合是连接到服务器端。这里的“localhost”作为值将指的是解析为 localhost 在服务器上。这就是你想要的。 最后,SSH 隧道的关键在于您的本地设备上有一个 本地 端口 - 这是隧道“开始”的地方。因此,您希望您的 JDBC 连接 到 localhost。你正在连接到ipAddress,不管它是什么。

所以,固定的代码是:

// The host in the cloud running an SSH server that you're connecting to.
String tunnelHost = "mypsqlserverinthecloud.com";
// The host in the cloud with the PSQL server, as you would
// connect to it from tunnelHost! In most cases this should be localhost!
String psqlHost = "localhost";
int psqlPort = 5432; // port of the psql server on the psql box.
int tunnelPort = 1234; // pick whatever you want here.
String username = "LDT";
String password = "hunter2"; // please see note below!

JSch session = new JSch();
session = jsch.getSession(username, tunnelHost, 22);
// Why aren't you using key-based authentication?
// Why aren't you using strict host key checking?
// None of this is particularly secure as a consequence!
session.setPassword(password);
session.setConfig("StrictHostKeyChecking", "no");
session.connect();

System.out.println("Connected Successfully");
session.setPortForwardingL(tunnelPort, psqlHost, psqlPort);
System.out.println("Port Forwarded");

String dbUrl = "jdbc:postgresql://localhost:" + tunnelPort + "/" + dbName;
// you do not need Class.forName. Not for the past 20 years.
// what stone age tutorial are you following?
// Consider that it probably contains more bad / obsolete advice!
Connection con = DriverManager.getConnection(dbUrl, username, password);
System.out.println("connect DB success");

这里还有多个代码样式错误。例如,如果你曾经编写过捕获异常的代码,e.printStackTrace() 它,然后继续运行,停止你正在做的事情。那是可怕的,可怕的错误处理。只需让这些方法抛出已检查的异常。连接到数据库的方法应该抛出 SQLException 和可能的 IOException。如果你真的不能这样做或不想这样做,那么要么处理异常,而且对于 90%+ 的异常,你什么都想不到(这是正常的),它应该总是以 throw 结尾.所以不是:

 catch (SQLException e) 
e.printStackTrace();
return null; // idiotic. Do not do this.

改为:

public void theMethodThisCodeWasIn() throws SQLException 

如果你做不到,那就做:

 catch (SQLException e) 
    throw new RuntimeException("Not handled", e);

例如。最好写出如何处理异常;抛出类型 RuntimeException 是最后的手段。但仍然比 e.printStackTrace();英里 并继续奔跑!

【讨论】:

更好的是让系统自动分配隧道端口号,而不是硬编码。见Connect to remote MySQL database through SSH using Java。 非常感谢您的支持。它有助于我的代码工作。我将从您和社区中学到很多东西。再次感谢兄弟

以上是关于装postgresql时为啥连接失败的主要内容,如果未能解决你的问题,请参考以下文章

如何解决 postgresql 错误“连接尝试失败”?

为啥连接失败时 PDO 会打印我的密码?

为啥连接测试失败?

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

SonarQube 8.5 的 PostgreSQL 连接失败

WebService连接postgresql( 失败尝试)