java - 方法完成后 PostgreSQL 关闭连接

标签 java spring postgresql spring-boot spring-mvc

我注意到我最近无法访问我的 PostgreSQL。我允许的所有 20 个连接都用完了。我不明白为什么,因为我没有打开任何东西。似乎即使在 PC 关闭或其他情况下,事情仍保持打开状态。我正在使用本地工作的远程真实数据库,并且当我使用相同的数据库推送它时。

这是一个示例方法,我想知道是否需要在使用后关闭

@RequestMapping("/users")
public String users(Model model) {
    try {
        Connection connection = getConnection();
        Statement stmt = connection.createStatement();
        String sql;
        sql = "SELECT id, first, last, email, company, city FROM cuser";
        ResultSet rs = stmt.executeQuery(sql);
        StringBuffer sb = new StringBuffer();
        List users = new ArrayList<>();
        while (rs.next()) {
            int id = rs.getInt("id");
            String first = rs.getString("first");
            String last = rs.getString("last");
            String email = rs.getString("email");
            String company = rs.getString("company");
            String city = rs.getString("city");
            users.add(new User(id,first, last, email, company, city));
        }
        model.addAttribute("users", users);
        return "user";
    }catch(Exception e) {return e.toString();}
}

我应该如何在此方法结束时关闭连接

非常感谢有时间回答的人

最佳答案

好的,这里有几个问题。

首先,数据库连接最终确实需要超时。有时,由于某些报告需要很长时间或类似问题,超时会延长到荒谬的程度,但这是一种反模式。您需要连接超时,以便在出现连接中断等错误时,数据库可以从中恢复。

其次,在完成连接后始终关闭连接。这里最简单的方法是使用 try-with-resources,这将确保您的资源以正确的顺序关闭,没有异常屏蔽的机会(关闭抛出的异常会导致 try block 中抛出先前的异常迷路,这很糟糕,因为这意味着您不知道代码失败的原因):

try (Connection connection = getConnection(); 
    Statement stmt = connection.createStatement();
    ResultSet rs = stmt.executeQuery(sql)) {
    StringBuffer sb = new StringBuffer();
    List users = new ArrayList<>();
    while (rs.next()) {
        int id = rs.getInt("id");
        String first = rs.getString("first");
        String last = rs.getString("last");
        String email = rs.getString("email");
        String company = rs.getString("company");
        String city = rs.getString("city");
        users.add(new User(id,first, last, email, company, city));
    }
    model.addAttribute("users", users);
    return "user";
}

第三,考虑在您的 Spring Boot 应用程序中使用更多的 Spring。您将数据访问 glommed 到您的 Controller 中,因此您没有关注点分离,并且您没有利用任何 Spring 提供的功能,如 JDBC 模板,资源关闭、命名参数、数据异常转换(以便异常你从 jdbc 调用中返回是有意义的),或者事务处理(让你在同一个事务中进行多个 DAO 调用)。参见 this link用于 spring-jdbc 文档。

顺便说一下,确保你使用了一个连接池;让请求使用池中的现有连接比建立新连接要快得多。当您从池中获得连接时,它会包装在一个对象中,该对象将连接返回到池中,并在您对其调用关闭时进行清理(如回滚任何正在进行的事务)。

关于java - 方法完成后 PostgreSQL 关闭连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38545507/

相关文章:

java - 在 Java 中与基于文本的游戏中的其他对象交互

java - 通过网络解耦 UI 和计算的简单示例

java - 使用 Spring-Java 测试 Oracle DB 表结构

sql - postgres 中的 regexp_replace 仅保留单个空格

postgresql - 将 PostgreSQL 数据恢复到现有数据库中

java - 在 UML 中,是否包含方法中定义的变量?

java - 帮助使用缓冲图像中的橡皮擦

ruby-on-rails - pg_search gem 和全文搜索排名设置

java - SpringBootTest - 只创建必要的bean

java - 使用 Spring 和 AspectJ 在类上定位基于注释的方面