List 如何通过JDBC驱动程序列出服务器上的PostgreSQL数据库?

List 如何通过JDBC驱动程序列出服务器上的PostgreSQL数据库?,list,postgresql,jdbc,database-schema,List,Postgresql,Jdbc,Database Schema,我必须制作一个图形界面,允许用户输入一个IP/端口(最好不要输入其他端口),并列出在这个地址找到的所有PostgreSQL数据库 服务器上的pg_hba.conf文件将按以下方式配置: host all all 0.0.0.0/0 md5 host all all 0.0.0.0/0 trust try ( Connection conn = DriverManager.getConnection("jdbc:postgresql://

我必须制作一个图形界面,允许用户输入一个IP/端口(最好不要输入其他端口),并列出在这个地址找到的所有PostgreSQL数据库

服务器上的pg_hba.conf文件将按以下方式配置:

host    all    all    0.0.0.0/0    md5
host    all    all    0.0.0.0/0    trust
try (
    Connection conn = DriverManager.getConnection("jdbc:postgresql://<ip>:<port>/postgres", "postgres", null);
    PreparedStatement ps = conn.prepareStatement("SELECT datname FROM pg_database WHERE datistemplate = false;");
    ResultSet rs = ps.executeQuery()) {

    while (rs.next()) {
        System.out.println(rs.getString(1));
    }
}
catch (Exception e) { e.printStackTrace(System.err); }
有没有一种方法可以列出数据库而不必连接其中一个

如果我这样设置服务器的配置:

host    all    all    0.0.0.0/0    md5
host    all    all    0.0.0.0/0    trust
try (
    Connection conn = DriverManager.getConnection("jdbc:postgresql://<ip>:<port>/postgres", "postgres", null);
    PreparedStatement ps = conn.prepareStatement("SELECT datname FROM pg_database WHERE datistemplate = false;");
    ResultSet rs = ps.executeQuery()) {

    while (rs.next()) {
        System.out.println(rs.getString(1));
    }
}
catch (Exception e) { e.printStackTrace(System.err); }
我可以通过postgres用户连接到postgres数据库,并按以下方式列出数据库:

host    all    all    0.0.0.0/0    md5
host    all    all    0.0.0.0/0    trust
try (
    Connection conn = DriverManager.getConnection("jdbc:postgresql://<ip>:<port>/postgres", "postgres", null);
    PreparedStatement ps = conn.prepareStatement("SELECT datname FROM pg_database WHERE datistemplate = false;");
    ResultSet rs = ps.executeQuery()) {

    while (rs.next()) {
        System.out.println(rs.getString(1));
    }
}
catch (Exception e) { e.printStackTrace(System.err); }
试试看(
连接conn=DriverManager.getConnection(“jdbc:postgresql://:/postgres”,“postgres”,null);
PreparedStatement ps=conn.prepareStatement(“从pg_数据库中选择datname,其中datistemplate=false;”);
结果集rs=ps.executeQuery()){
while(rs.next()){
System.out.println(rs.getString(1));
}
}
catch(异常e){e.printStackTrace(System.err);}

但是信托期权确实是不安全的,不能使用它。但是,如果不给用户一个密码,就无法使用JDBC连接到该用户,对吗?

不行,正如您所说:如果不先连接到任何数据库,就无法查询任何数据库(列出数据库是一种查询)

希望PostgreSQL在
pg_hba.conf
中有一个内置的安全系统。您必须(在防火墙顶部)对其进行调整,以仅允许:

  • 特定IP
  • 和/或特定用户
  • 使用特定的身份验证机制
请注意,PostgreSQL处理SSL,因此您可以像信任HTTPS等任何连接一样信任它的连接

有关更多信息,请参阅。

尝试使用此解决方案: