繁体   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