簡體   English   中英

Postgresql JDBC Android上的連接錯誤

[英]Postgresql JDBC connection error on Android

我無法在 Android 上連接 PostgreSQL 數據庫。 使用 JDBC 僅用於開發目的,將更改為正確的 web 服務。

  1. 我已經實施了Z399BD1EE587245ECAC6F39BEAA9986FZ驅動程序,build.gradle作為“實施
  2. 我的 PostgreSQL 數據庫服務器正在監聽端口:5433
  3. 我的網絡中的電腦 IP 是 192.168.1.103
  4. 並且用戶名和密碼設置正確

連接:

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:連接被拒絕。 檢查主機名和端口是否正確以及 postmaster 是否接受 TCP/IP 連接

而當我使用我電腦的IP地址如上圖連接代碼時,連接con = DriverManager.getConnection(postgresConnUrl, props); 正在返回 null。 日志顯示沒有異常或錯誤,但 con 是 null,我無法追蹤問題。 任何有關該問題的指示都會有所幫助。

DriverManager.getConnection(...)無法返回null 除非實現中存在嚴重錯誤,否則它總是返回非空連接拋出SQLException (或驅動程序拋出的RuntimeExceptionError )。

The PostgreSQL driver is likely causing an Error to be thrown (eg a NoClassDefFoundError , because the PostgreSQL JDBC driver uses Java features or classes not present on Android). 這被您的finally塊將無條件返回con的事實所隱藏,並且您只捕獲和記錄Exception的實例,而不是Error 另請參閱在 finally 中添加 return 隱藏異常

刪除您的catchfinally阻止並讓任何異常或其他Throwable冒泡到調用者,而不是將顯式異常或錯誤替換為隱藏錯誤(返回null ),或者讓 catch 塊將異常包裝在自定義異常中並拋出那個自定義異常。

我建議您不要在 Android 上使用 JDBC。 最新的 JDBC 驅動程序正在使用 Java 功能或 Android 上不存在的類,這可能會導致各種問題。 您提到您這樣做是出於開發目的,但我建議從一開始就創建或使用 mocking 您的 REST API 並使用它會為您節省很多麻煩和不必要的開發工作。

我嘗試使用舊版本的 JDBC 並且能夠連接。 JDBC 的較新版本似乎與 Android 不兼容,並導致您發布的錯誤。 但是,我仍然可以看到很多人在使用 JDBC,因為它很容易,盡管 Rest API 是更好的選擇,但需要額外的技能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM