方法完成后PostgreSQL关闭连接

时间:2016-07-23 19:07:04

标签: java postgresql spring-mvc spring-boot

我注意到我最近无法访问我的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();}
}

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

非常感谢任何有时间回答的人

2 个答案:

答案 0 :(得分:2)

好的,这里有几个问题。

首先,数据库连接最终需要超时。有时由于某些报告需要永久或类似的问题,超时会扩展到荒谬的事情,但它是反模式。您需要连接超时,以便在出现类似搁浅连接的错误时,数据库可以从中恢复。

其次,当您完成连接时,请务必关闭连接。这里最简单的方法是使用try-with-resources,这将确保您的资源以正确的顺序关闭而不会出现异常屏蔽(其中由关闭抛出的异常会导致try块中抛出先前的异常迷路,这很糟糕,因为这意味着你不知道你的代码失败的原因):

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。您可以将数据访问权限放入控制器中,因此您不必关注任何问题,并且您没有利用任何Spring提供的功能(如JDBC模板),资源关闭,命名参数,数据异常转换(以便您从jdbc调用返回的异常有意义)或事务处理(允许您在同一事务中进行多个DAO调用)。有关spring-jdbc文档,请参阅this link

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

答案 1 :(得分:0)

这个怎么样(假设您直接使用JDBC打开自己的连接)......

Connection conn = null;
ResultSet rs    = null;
try {
    conn = getConnection();
    ...
} catch (Exception ex) {
    ...
} finally {
     if (rs != null) { 
         try { rs.close(); } catch (Exception ex) { ... }
     }
     if (conn != null) {
         try { conn.close(); } catch (Exception ex) { ... }
     }
}