通过VPN连接Java PostgreSQL

时间:2013-08-08 18:59:28

标签: java postgresql vpn psycopg2

我有一个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地址) )。

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

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

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

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

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:2)

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

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

-Djava.net.preferIPv4Stack=true

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