[英]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.