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