写点什么

因 Druid 配置导致 YashanDB 报 YAS-04003 打开游标数过多的问题分析

作者:数据库砖家
  • 2025-05-15
    广东
  • 本文字数:544 字

    阅读完需:约 2 分钟

问题场景

某企业在运行 Java 应用时出现如下数据库错误提示:

YAS-04003: maximum number of open cursors is 1000
复制代码

导致业务无法正常运作。

适用范围

所有版本的 YashanDB 都可能受到此类问题影响。

根本原因

该问题源于 Druid 数据库连接池对 PreparedStatement 的缓存机制。具体配置如下:

share-prepared-statements: truepool-prepared-statements: truemax-open-prepared-statements: 100
复制代码

这些设置会使得 JDBC 层的 PreparedStatement 被持续缓存,而 YashanDB 会将每一个未释放的 Statement 视为一个活动游标。一旦累计打开游标数量超过数据库默认配置的 OPEN_CURSORS 上限,就会抛出上述异常。

解决方案

有两种思路可选:

① 调整数据库参数:增大 OPEN_CURSORS 的取值上限。

② 优化 Druid 配置

将 share-prepared-statements 设置为 false将 pool-prepared-statements 设置为 false设置 max-open-prepared-statements = -1 表示不缓存
复制代码

排查手段

可以通过以下语句查看当前打开的游标内容:

select b.sql_textfrom vopencursora a, vsql bwhere a.sql_id = b.sql_id;
复制代码

结合 v$session 来判断是哪些业务会话未释放资源。

经验建议

当使用 Java 框架并搭配数据库中间件时,需要注意连接池与数据库行为之间的配合策略。合理调整缓存策略是避免资源泄露、提高系统稳定性的关键。

用户头像

还未添加个人签名 2025-04-09 加入

还未添加个人简介

评论

发布
暂无评论
因 Druid 配置导致 YashanDB 报 YAS-04003 打开游标数过多的问题分析_数据库_数据库砖家_InfoQ写作社区