潜在的数据库资源泄漏¶
ID: java/database-resource-leak
Kind: problem
Security severity:
Severity: warning
Precision: high
Tags:
- correctness
- resources
- external/cwe/cwe-404
- external/cwe/cwe-772
Query suites:
- java-security-and-quality.qls
已打开但未关闭的 java.sql
包中的数据库资源可能会导致资源泄漏,最终导致资源耗尽。
建议¶
确保始终关闭资源以避免资源泄漏。请注意,由于存在异常,因此最安全的方法是在 finally
块中关闭资源。
对于 Java 7 或更高版本,关闭实现 java.lang.AutoCloseable
的资源的推荐方法是在 try-with-resources
语句中声明它们,以便隐式关闭它们。
示例¶
在以下示例中,资源 stmt
和 rs
已打开但未关闭。
public class CloseSql {
public static void runQuery(Connection con, String query) throws SQLException {
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(query);
while (rs.next()) {
// process result set
}
}
}
在以下示例中,资源 stmt
和 rs
在 try-with-resources
块中声明,因此会隐式关闭它们。
public class CloseSqlGood {
public static void runQuery(Connection con, String query) throws SQLException {
try (Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(query)) {
while (rs.next()) {
// process result set
}
}
}
}
请注意,传递到方法中的 Connection
是一个长寿命对象,它是在其他地方创建的,因此无需在本地关闭。相反,它应该由创建它的代码或服务器关闭过程(视情况而定)关闭。
参考¶
IBM developerWorks:Java 理论与实践:良好的家务习惯。
Java 教程:try-with-resources 语句。
常见弱点枚举:CWE-404。
常见弱点枚举:CWE-772。