没有路由到主机异常 - 尝试远程连接到Postgresql数据库

时间:2017-08-03 13:59:36

标签: java database postgresql

我目前正在尝试通过Java程序远程连接到Postgresql。我有JDBC驱动程序工作,但当我尝试连接到数据库时,连接失败,我收到java.net.NoRouteToHostException: No route to host (Host unreachable)错误。

到目前为止,我已经做了以下尝试来解决问题:

  1. 在包含postgresql数据库的服务器上,我更改了pg_hba.conf以包含尝试连接的设备的IP地址:

    # IPv4 local connections: host all all 127.0.0.1/32 trust host all all 192.168.25.170/32 trust

  2. 我还更新了postgresql.conf,以便#listen_addresses = 'localhost'更改为#listen_addresses = '*' 根据建议

  3. 修改更改为listen_addresses = '*'

    我多次重启计算机但仍然出错。我注意到的一件事是,当我执行sudo netstat -nlp | grep postgres时,我得到了:

    `tcp     0     0 0.0.0.0:5433     0.0.0.0:*     LISTEN     1309/postgres
     tcp6    0     0 :::5433          :::*          LISTEN     1309/postgres
     unix  2     [ ACC ]     STREAM     LISTENING     20873     1309/postgres     /tmp/.s.PGSQL.5433`
    

    这让我感到困惑,因为我知道postgres的默认端口应该是5432,我很好奇,因为这不是我遇到问题的默认端口吗?

    修改 请注意,我已在本地运行代码以访问数据库,并在本地运行完美。当我编辑代码时,远程访问是在发生错误时。这是java代码:

    public class HdfsTransferToDatabase {
    
    public static void main(String[] args) throws SQLException {
    
        //SQLData sql = new SQLData();
    
        System.out.println("---------- PostgreSQL JDBC Connection Testing ----------");
    
        try {
            Class.forName("org.postgresql.Driver");
        } catch (ClassNotFoundException e) {
    
            System.out.println("Where is your PostgreSQL JDBC Driver? " 
                            + "Include it in your library path.");
            e.printStackTrace();
            return;
        }
    
        System.out.println("---------- PostgreSQL JDBC Driver Registered ----------");
    
        Connection connection = connect();
    
        if(connection != null) {
            System.out.println("---------- Connection Successful for PostgreSQL ----------");
            //sql.viewTable(connection);
        } else {
            System.out.println("---------- Connection Failed for PostgreSQL ----------");
        }
    }
    
    private static Connection connect() {
        //Connection string
        String url = "jdbc:postgresql://192.168.25.179:5433/gisdb";
        Connection conn = null;
    
        try {
            conn = DriverManager.getConnection(
                    url, "testuser", "testpassword");
        } catch (SQLException e) {
            System.out.println("Connection Failed! Check output console.");
            e.printStackTrace();
        }
    
        return conn;
    }
    
    }
    

    非常感谢任何帮助!

2 个答案:

答案 0 :(得分:0)

引起我注意的是你对postgresql.conf的更改。如果您确实将行更改为#listen_addresses = '*',则可能是问题所在。该行开头的#将该行标记为注释,因此它无效,并且监听地址默认为localhost

请尝试删除postgresql.conf中#前面的listen_address

listen_addresses = '*'

答案 1 :(得分:0)

在我个人的情况下,我认为安装Postgres时出现了问题。尽管pg_hba.conf更新了postgres以使用端口5432,但它实际上并没有使用此端口,并且端口5433不允许我访问任何内容。

我通过这个过程删除了Postgres:

yum remove postgres\* mv /var/lib/pgsql /var/lib/old.pgsql

然后我使用这些instructions来重新安装postgres,除了我使用以下yum存储库安装9.5.3而不是9.4。

http://yum.postgresql.org/9.5/redhat/rhel-7-x86_64/pgdg-centos95-9.5-3.noarch.rpm

请注意,我使用的是Centos 7 x64。

我像以前一样对pg_hba.confpostgresql.conf进行了更改,确保我从#取出postgresql.conf,现在一切正常!