【问题标题】:Java PostgreSQL connection over VPN通过 VPN 的 Java PostgreSQL 连接
【发布时间】:2013-08-10 15:14:15
【问题描述】:

我有一个 Java 应用程序需要通过 VPN 连接到远程 PostgreSQL 数据库。以下是相关代码:

Class.forName("org.postgresql.Driver");
Connection con = null;
con = DriverManager.getConnection("jdbc:postgresql://" + sqlHost + ":" + sqlPort + "/mydb", username, password);

这会引发错误

org.postgresql.util.PSQLException: FATAL: pg_hba.conf rejects connection for host "172.16.7.5", user "xxxxx", database "xxxxx", SSL off

sqlHost 中的主机 IP 地址实际上是 192.168.12.55,但是如果您注意到错误消息说它正在连接到主机 172.16.7.5(这是 VPN 分配的 IP 地址)。

我可以使用 PGAdmin 使用 Python 的 psocopg2 模块在完全相同的 VPN 上使用完全相同的连接参数连接到这个 PostgreSQL 数据库。这是等效的 Python 代码:

conn = psycopg2.connect("dbname=mydb user="+username+" password="+password+" host="+sqlHost+" port="+sqlPort)

为什么世界上只有 Java 有这方面的问题?由于连接通过 PGAdmin 和 Python 工作,我假设 Java 中有一些设置我使用不正确,但我找不到任何东西。

编辑:在阅读更多 PostgreSQL 文档后,我发现列出错误主机名的问题不是问题的一部分,而只是 PostgreSQL 通过 VPN 看到我的计算机的方式。然而问题仍未解决。

【问题讨论】:

  • 我相信这属于Super User(或者可能是Server Fault
  • 我认为它更适合 StackOverflow,因为它与我正在创建的应用程序的代码有关。我需要知道 Java 的 SQL 连接管理器中是否有一个特殊参数允许它在 VPN 上正常工作。

标签: java postgresql vpn psycopg2


【解决方案1】:

我不确定这是否是问题所在,但我过去在尝试连接到启用 VPN 的数据库时遇到过类似问题。

尝试使用在应用程序启动时传递的 JVM 参数运行您的应用程序:

-Djava.net.preferIPv4Stack=true

另请参阅answer 以获得更持久的解决方案。

【讨论】:

  • 我尝试将-Djava.net.preferIPv4Stack=true 添加到eclipse.ini 并在我的代码中添加System.setProperty("java.net.preferIPv4Stack" , "true")。两种情况都没有运气。
【解决方案2】:

好的,我自己解决了这个问题。这个问题与 VPN 无关,而是 Java 默认不尝试任何类型的 SSL 连接,而 PGAdmin 和 psycopg2 这样做。

解决方案是将以下参数添加到我的连接 url: ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory

【讨论】:

  • 好收获。为了其他可能遇到此问题的读者的利益,您也应该将此标记为您的答案。 :)
猜你喜欢
  • 2019-10-01
  • 2017-04-13
  • 2015-02-20
  • 2012-04-22
  • 2023-03-08
  • 2011-12-21
  • 2016-07-31
  • 2011-12-16
  • 2012-07-06
相关资源
最近更新 更多