Android上的Postgresql JDBC连接错误

Posted

技术标签:

【中文标题】Android上的Postgresql JDBC连接错误【英文标题】:Postgresql JDBC connection error on Android 【发布时间】:2021-02-11 17:47:48 【问题描述】:

我无法在 android 上连接 PostgreSQL 数据库。使用 JDBC 仅用于开发目的,将更改为适当的 Web 服务。

    我已将 build.gradle 中的 PostgreSQL 驱动程序实现为“implementation 'org.postgresql:postgresql:42.2.18.jre7” 我的 PostgreSQL 数据库服务器正在监听端口:5433 我网络中的电脑IP是192.168.1.103 并且用户名和密码设置正确

连接:

Connection con = null;
try

    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);

    /* Register jdbc driver class. */
    Class.forName("org.postgresql.Driver");

    /* Create connection url. */
    String postgresConnUrl = "jdbc:postgresql://192.168.1.103:5433/lmsdb";

    Properties props = new Properties();
    props.setProperty("user","postgres");
    props.setProperty("password","xxxxxxx");
    props.setProperty("ssl","false");

    /* Get the Connection object. */
    con = DriverManager.getConnection(postgresConnUrl, props);
catch(Exception ex)

    ex.printStackTrace();
finally

    return con ;

当我将“postgresConnUrl”中的 IP 更改为 pg_hba 中设置的 127.0.0.1 时,出现错误

org.postgresql.util.PSQLException:连接被拒绝。检查 主机名和端口是正确的,并且邮局主管正在接受 TCP/IP 连接

当我使用上面连接代码所示的计算机 IP 地址时,连接 con = DriverManager.getConnection(postgresConnUrl, props); 返回 null。日志显示没有异常或错误,但 con 为空,我无法追踪问题。任何解决问题的方法都会有所帮助。

【问题讨论】:

【参考方案1】:

DriverManager.getConnection(...) 不能返回null。除非实现中存在严重错误,否则它总是返回非空连接抛出SQLException(或驱动程序抛出的RuntimeExceptionError)。

PostgreSQL 驱动程序可能会导致抛出 Error(例如 NoClassDefFoundError,因为 PostgreSQL JDBC 驱动程序使用 Android 上不存在的 Java 功能或类)。这被您的finally 块将无条件返回con 的事实所隐藏,并且您只捕获和记录Exception 的实例,而不是Error。另见Adding return in finally hides the exception

删除您的 catchfinally 块,让任何异常或其他 Throwable 冒泡到调用者,而不是用隐藏错误(返回 null)替换显式异常或错误,或者使用catch 块包装自定义异常中的异常并抛出该自定义异常。

我建议您不要在 Android 上使用 JDBC。最新的 JDBC 驱动程序使用的是 Android 上不存在的 Java 功能或类,这可能会导致各种问题。您提到您这样做是出于开发目的,但我建议创建或模拟您的 REST API 并从一开始就使用它可以为您省去很多麻烦和不必要的开发工作。

【讨论】:

你好 Mark,我删除了 finally 块,是的,错误是 NoClassDefFoundError: Failed resolution of: Ljava/lang/management/ManagementFactory 所以这是否意味着 Postgres JDBC 不能与 Andriod 一起使用? @DeeyoPradhan 是的,JDBC 驱动程序在编写时考虑了 JVM 和 JRE,而不是 Android。您会发现最新的 JDBC 驱动程序无法在 Android 上运行。也许你很幸运,旧版本的驱动程序可以工作,但不要指望它。出于这个原因(以及许多其他原因),最好的建议是:不要在 Android 上使用 JDBC 是的,我最好不要尝试它,因为它占用了我很多时间,我会将其标记为答案,因为它对我有帮助。如果您知道我可以用于 postgres 的任何 Guthub 或 RESTFUL API 项目示例,请告诉我,因为我的时间不多了。非常感谢。【参考方案2】:

我尝试使用旧版本的 JDBC 并且能够连接。较新版本的 JDBC 似乎与 Android 不兼容,并导致您发布的错误。但是,我仍然可以看到很多人在使用 JDBC,因为它很容易,尽管 Rest API 是更好的选择,但需要额外的技能。

【讨论】:

以上是关于Android上的Postgresql JDBC连接错误的主要内容,如果未能解决你的问题,请参考以下文章

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

Jdbc Postgresql 没有执行查询

无法使用 Postgresql 将 JDBC 连接到 sonarqube

使用 JDBC 连接到 PostgreSql 的本地实例

连接到 postgresql:dbserver db 通过 JDBC 连接到 Databricks 时连接被拒绝

使用 JDBC 连接到 PostgreSQL 数据库时选择角色