我注意到我最近无法访问我的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();}
}
如何在此方法结束时关闭连接
非常感谢任何有时间回答的人
答案 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) { ... }
}
}