使用jdbc的postgresql的连接性问题

eqqqjvef  于 2021-06-26  发布在  Java
关注(0)|答案(1)|浏览(391)

我有一个基于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();
    }
}
8xiog9wr

8xiog9wr1#

这段代码显然永远不会工作-你在 finally 阻止。此构造函数不可能在连接正常的情况下完成。
还要注意,类似这样的情况:

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

一句话就是愚蠢。你把非常有用的信息拿出来扔掉,用完全无用的信息代替。如果您想将用户和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,然后用它。

相关问题