温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Cursor游标如何防止泄漏

发布时间:2026-08-31 18:55:50 来源:亿速云 阅读:94 作者:小樊 栏目:数据库

在数据库/编程语境里,Cursor(游标)泄漏通常指:打开游标后没有及时关闭,导致连接、内存或句柄一直被占用,最终造成连接池耗尽、内存上涨或数据库性能下降。

下面从原则、常见语言做法、数据库层面、排查方法几个角度讲如何防止 Cursor 泄漏。


一、核心原则(最重要)

“谁打开,谁关闭;用完即关”

  • 游标不是垃圾回收对象(尤其数据库游标)
  • 不关闭 ≠ 马上出错,但会慢慢拖垮系统
  • 优先使用「自动关闭」机制,而不是手动关

二、不同语言/框架的防泄漏做法

1. Python(最常见)

✅ 推荐:使用 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()

2. Java(JDBC)

✅ 使用 try-with-resources

try (Connection conn = dataSource.getConnection();
     PreparedStatement ps = conn.prepareStatement(sql);
     ResultSet rs = ps.executeQuery()) {

    while (rs.next()) {
        // 处理
    }
}
// 自动关闭

❌ 只关 Connection 不关 ResultSet / Statement 也会泄漏


3. Go(database/sql)

Go 的 sql.Rows 必须显式关闭:

rows, err := db.Query(sql)
if err != nil {
    return err
}
defer rows.Close()

for rows.Next() {
    // ...
}

defer rows.Close() 是防泄漏关键


4. Node.js

const [rows] = await conn.query(sql);
// mysql2 / pg 通常自动管理

⚠️ 但:

  • 长连接 + 不释放连接 → 不是 cursor 泄漏,而是连接泄漏
  • 使用连接池并 release()

三、数据库层面的防护

1. 设置游标超时(MySQL 示例)

SET SESSION wait_timeout = 28800;

2. 限制游标数量(PostgreSQL)

SET max_open_cursors = 500;

3. 使用服务器端游标时注意

  • 客户端游标:关 client 即可
  • 服务端游标:必须显式 CLOSE
CLOSE cursor_name;

四、连接池层面的防护

  • 设置最大连接数
  • 设置空闲回收时间
  • 开启连接泄漏检测(如 HikariCP)
HikariConfig config = new HikariConfig();
config.setLeakDetectionThreshold(2000); // 2秒

五、如何排查 Cursor 泄漏

常见现象

  • 数据库连接数持续上涨
  • 相同 SQL 执行变慢
  • 报错:Too many connections
  • 内存缓慢增长

排查手段

  • 数据库侧:
    SHOW PROCESSLIST;
    
  • 应用侧:
    • 日志中统计 cursor.open / close
    • APM(SkyWalking / Prometheus)

六、一句话总结

防止 Cursor 泄漏 = 自动关闭 > 手动关闭 > 不关

如果你指的是某个具体数据库(MySQL / Oracle / PG)或语言(Java / Python / Go),我可以给你更针对性的示例。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI