CodeQL 文档

潜在的数据库资源泄漏

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

单击以查看 CodeQL 存储库中的查询

已打开但未关闭的 java.sql 包中的数据库资源可能会导致资源泄漏,最终导致资源耗尽。

建议

确保始终关闭资源以避免资源泄漏。请注意,由于存在异常,因此最安全的方法是在 finally 块中关闭资源。

对于 Java 7 或更高版本,关闭实现 java.lang.AutoCloseable 的资源的推荐方法是在 try-with-resources 语句中声明它们,以便隐式关闭它们。

示例

在以下示例中,资源 stmtrs 已打开但未关闭。

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
		}
	}
}

在以下示例中,资源 stmtrstry-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 是一个长寿命对象,它是在其他地方创建的,因此无需在本地关闭。相反,它应该由创建它的代码或服务器关闭过程(视情况而定)关闭。

参考

  • ©GitHub, Inc.
  • 条款
  • 隐私