gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 12:57:50 34 4
gpt4 key购买 nike

我注意到我最近无法访问我的 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/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com