我有一个基于java的遗留web应用程序,它使用oracle7。现在我正在将oracle7迁移到postgresql。我们与oracle有正常的jdbc连接,因为我们没有使用hibernate、ibatis等任何框架,所以我们以编程方式创建连接、连接池并使用它。它对oracledb工作得很好。
但作为迁移的一部分,当我使用postgresql细节进行更改并尝试将db与我的应用程序连接时。仅在第一次db调用时,连接就丢失了,在日志中我看到了sql:08003 issue. 因为它是基于web的应用程序,所以我们正在创建war并将其部署到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();
}
}
1条答案
按热度按时间8xiog9wr1#
这段代码显然永远不会工作-你在
finally
阻止。此构造函数不可能在连接正常的情况下完成。还要注意,类似这样的情况:
一句话就是愚蠢。你把非常有用的信息拿出来扔掉,用完全无用的信息代替。如果您想将用户和url信息添加到异常中(我在这里不想这样做,它不太可能特别相关),请将您 Package 的异常作为原因(
new SQLException(msg, x)
),以便您可以看到那里的数据。sqlexception包含大量有用的信息。通过扔掉
x
,您无法看到所有这些有用的信息。我们以编程方式创建了连接,连接池并使用了它。
上面的代码不是连接池。
DBConnection
java惯例说你写DbConnection
. 另外,你不需要在你的领域(它是connection
,不是mTheConnection
).if (mTheConnection == null) {
这不可能发生;这是死代码。getconnection不能返回null。当然,在不太可能发生这种情况的情况下,您的代码会抛出sqlexception,从而控制移到finally块,在finally块中close()
在一个null引用上调用,该引用抛出一个npe,它将覆盖您的sqlexception(errmsg)。这代码乱七八糟。我的建议?把它全扔掉。去拿hikaricp,然后用它。