簡體   English   中英

使用 JDBC 的 Postgresql 的連接問題

[英]Connectivity issue with Postgresql using JDBC

I have a legacy Java based web application which used Oracle 7. Now I'm migrating Oracle 7 to PostgreSQL. 我們與 Oracle 有正常的 JDBC 連接,因為我們沒有使用任何框架,如 Hibernate、iBATIS 等,因此我們以編程方式創建了連接、連接池並使用了它。 它適用於 Oracle DB。

但作為遷移的一部分,當我更改 PostgreSQL 詳細信息並嘗試將數據庫與我的應用程序連接時。 僅在第一次 DB 調用時,連接丟失,在日志中我看到 SQL:08003 問題。 由於它是基於 web 的應用程序,因此我們正在創建戰爭並將其部署到 apache-tomcat-8.5.50 服務器中。 PostgreSQL 版本是 postgresql-42.2.18.jar。

我檢查了很多博客,但我無法弄清楚為什么會出現這個問題。

代碼:

public DBConnection(String dbUrl, String user, char[] pwd) throws SQLException {
    String errMsg = "Failed to get connection for login: " + user + " in URL = " + dbUrl;           
    try {
        // Connect to database
      mTheConnection = DriverManager.getConnection(dbUrl, user, new String(pwd));
        if (mTheConnection == null) {
            throw new SQLException (errMsg);
        }   
        mTheConnection.setAutoCommit(false);
    } catch (SQLException x) {
        throw new SQLException(errMsg);
    }
    finally{
        mTheConnection.close();
    }
}

這段代碼顯然永遠無法工作——你在finally塊中關閉了連接。 這個構造函數不可能完成一個正常工作的連接。

還要注意這樣的事情:

} catch (SQLException x) {
    throw new SQLException(errMsg);
}

總之就是傻。 您正在獲取非常有用的信息並將其丟棄,並用完全無用的信息替換它。 如果您想將 user 和 URL 信息添加到異常中(我不會在這里,它不太可能特別相關),請將您包裝的異常作為原因( new SQLException(msg, x) ),以便您可以看到那里的數據。

SQLException 包含大量有用的信息。 通過丟棄x ,您將無法看到所有這些有用的信息。

我們以編程方式創建了連接、連接池並使用了它。

上面的代碼不是連接池。

DBConnection

Java 約定說你寫DbConnection 此外,您不會對您的字段進行匈牙利符號(它是connection ,而不是mTheConnection )。

if (mTheConnection == null) {

這永遠不可能發生; 這是死代碼。 getConnection 無法返回 null。 當然,在不太可能發生這種情況的情況下,您的代碼會拋出 SQLException,因此控制會轉移到 finally 塊,在 null 引用上調用close() ,這會引發 NPE,它會覆蓋您的 SQLException(errMsg)。 這段代碼是一團糟。

我的建議? 全部扔掉。 獲取HikariCP並使用它。

暫無
暫無

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

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