在数据库/编程语境里,Cursor(游标)泄漏通常指:打开游标后没有及时关闭,导致连接、内存或句柄一直被占用,最终造成连接池耗尽、内存上涨或数据库性能下降。
下面从原则、常见语言做法、数据库层面、排查方法几个角度讲如何防止 Cursor 泄漏。
“谁打开,谁关闭;用完即关”
✅ 推荐:使用 with(上下文管理器)
with conn.cursor() as cur:
cur.execute("SELECT * FROM user")
rows = cur.fetchall()
# 自动关闭 cursor
❌ 易泄漏写法:
cur = conn.cursor()
cur.execute("SELECT * FROM user")
# 忘记 cur.close()
✅ 如果必须手动:
try:
cur = conn.cursor()
cur.execute(sql)
finally:
cur.close()
✅ 使用 try-with-resources
try (Connection conn = dataSource.getConnection();
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery()) {
while (rs.next()) {
// 处理
}
}
// 自动关闭
❌ 只关 Connection 不关 ResultSet / Statement 也会泄漏
Go 的 sql.Rows 必须显式关闭:
rows, err := db.Query(sql)
if err != nil {
return err
}
defer rows.Close()
for rows.Next() {
// ...
}
✅ defer rows.Close() 是防泄漏关键
const [rows] = await conn.query(sql);
// mysql2 / pg 通常自动管理
⚠️ 但:
release()SET SESSION wait_timeout = 28800;
SET max_open_cursors = 500;
CLOSECLOSE cursor_name;
HikariConfig config = new HikariConfig();
config.setLeakDetectionThreshold(2000); // 2秒
Too many connectionsSHOW PROCESSLIST;
cursor.open / close防止 Cursor 泄漏 = 自动关闭 > 手动关闭 > 不关
如果你指的是某个具体数据库(MySQL / Oracle / PG)或语言(Java / Python / Go),我可以给你更针对性的示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。