装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时为啥连接失败的主要内容,如果未能解决你的问题,请参考以下文章
org.postgresql.util.PSQLException:连接尝试失败