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
(或驱动程序抛出的RuntimeException
或Error
)。
PostgreSQL 驱动程序可能会导致抛出 Error
(例如 NoClassDefFoundError
,因为 PostgreSQL JDBC 驱动程序使用 Android 上不存在的 Java 功能或类)。这被您的finally
块将无条件返回con
的事实所隐藏,并且您只捕获和记录Exception
的实例,而不是Error
。另见Adding return in finally hides the exception
删除您的 catch
和 finally
块,让任何异常或其他 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 数据库?
无法使用 Postgresql 将 JDBC 连接到 sonarqube