我试图使用JDBC连接到远程PostgreSQL数据库,但是连接超时。为了能够访问远程服务器,我连接到了一个隧道。当我试图从同一网络使用JDBC连接时,没有问题,只是远程连接。
我可以使用其他工具(如pgAdmin,HeidiSQL,python sqlalchemypsycopg2)远程和本地连接到数据库,但不能使用JDBC。我不需要添加其他工具的远程连接选项,只需要添加host:port和userpass。
在寻找解决方案的过程中,我尝试了以下方法,但没有成功。
"ssl"
有价值 "true"
驱动器连接"sslfactory"
有价值 "org.postgresql.ssl.NonValidatingFactory"
"loginTimeout"
有价值 20
listen_addresses = '*'
在 postgresql.conf
在远程服务器上host all all 0.0.0.0/0 md5
到 pg_hba.conf
在远程服务器上使用驱动版本 postgresql-42.2.14
. 我试图使用SQuirreL和MATLAB进行连接。
由于其他工具没有问题连接,我猜测这是关于调整JDBC设置.我在这里错过了什么?
编辑:尝试ping远程服务器的IP(192.168.x.x.),我得到。
Reply from 10.x.x.x: Destination net unreachable.
同时,我可以在同一个服务器IP上连接到数据库。这是不是问题的线索?
连接网址。jdbc:postgresql://192.168.x.x:5432/<dbname>
结果是... Test-NetConnection
PS > Test-NetConnection 192.168.x.x
WARNING: Ping to 192.168.x.x failed with status:
DestinationNetworkUnreachable
PS > Test-NetConnection 192.168.x.x -port 5432
ComputerName : 192.168.x.x
RemoteAddress : 192.168.x.x
RemotePort : 5432
InterfaceAlias : Local Area Connection 3
SourceAddress : 192.168.x.x
TcpTestSucceeded : True
跑步 tracert 192.168.x.x
Tracing route to 192.168.x.x over a maximum of 30 hops
1 <1 ms <1 ms <1 ms 192.168.0.1
2 10.x.x.x reports: Destination net unreachable.
Trace complete.
Stacktrace(SQuirreL)。
java.net.SocketTimeoutException: connect timed out
at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at org.postgresql.core.PGStream.<init>(PGStream.java:81)
at org.postgresql.core.v3.ConnectionFactoryImpl.tryConnect(ConnectionFactoryImpl.java:93)
at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:197)
at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:49)
at org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:217)
at org.postgresql.Driver.makeConnection(Driver.java:458)
at org.postgresql.Driver.connect(Driver.java:260)
at net.sourceforge.squirrel_sql.fw.sql.SQLDriverManager.getConnection(SQLDriverManager.java:147)
at net.sourceforge.squirrel_sql.client.mainframe.action.OpenConnectionCommand.executeConnect(OpenConnectionCommand.java:136)
at net.sourceforge.squirrel_sql.client.mainframe.action.OpenConnectionCommand.lambda$execute$0(OpenConnectionCommand.java:93)
at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
你ping的IP地址范围是192.168.x.x,但得到的回复却是10.x.x.x.x,这是两个不同的子网。
虽然看起来很奇怪,但这与你最初说的可以通过其他方式连接的说法并不一致。如果网络是问题,那么其他工具也会失败。如果有阻塞,ping "请求超时 "得不到回复是预料中的结果。
"Destination unreachable "意味着没有合适的路由可以到达你试图到达的IP。有了这个问题,从你的主机上应该无法连接到该主机的其他连接。
请确认你尝试的所有连接是否来自同一个客户端主机。另外,你是否尝试过ODBC连接器,看看是否有效?它允许系统DSN,你不需要做太多的尝试来连接。
请确保您从同一主机或同一网络上的两台机器进行测试,以简化事情。
对于 "Destination unreachable "的错误,如果使用相同的目标IP,你的客户端无论如何都不应该与服务器对话。