You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DB2循环调用生成JSON的存储过程读取CLOB时遇SQLCODE=-954错误求解决

问题描述

我的应用需要循环调用生成JSON的DB2存储过程,通过定义offset参数分多次(每次约20MB)获取结果,代码如下:

for (int i = 0; i <= 7; i++) {
        StoredProcedureQuery sp=
                em.createStoredProcedureQuery("CREATE_JSON");
        StoredProcedureQuery q= createStoredProcedureQuery
                .registerStoredProcedureParameter("result", Clob.class, ParameterMode.OUT)
                .registerStoredProcedureParameter("offset", Integer.class, ParameterMode.IN);
        q.setParameter("offset", i*50000);
        q.execute();
        Clob data = (Clob) registerStoredProcedureParameter.getOutputParameterValue("result");
    }

执行后触发如下错误:

ERROR: DB2 SQL Error: SQLCODE=-954, SQLSTATE=57011, SQLERRMC=null, DRIVER=4.8.86

单次调用该存储过程可正常运行,需解决循环调用报错的问题。

解决方案

DB2 SQLCODE=-954对应数据库临时存储空间不足,循环调用时未及时释放资源导致空间耗尽是核心原因,可从以下维度处理:

  • 主动释放Clob与查询资源
    每次循环处理完Clob数据后,必须调用free()释放Clob占用的临时空间,同时关闭查询对象避免连接资源泄漏:

    for (int i = 0; i <= 7; i++) {
        StoredProcedureQuery q = em.createStoredProcedureQuery("CREATE_JSON");
        q.registerStoredProcedureParameter("result", Clob.class, ParameterMode.OUT)
          .registerStoredProcedureParameter("offset", Integer.class, ParameterMode.IN);
        q.setParameter("offset", i*50000);
        q.execute();
        Clob data = (Clob) q.getOutputParameterValue("result");
        
        // 此处添加Clob数据处理逻辑(如读取JSON内容)
        
        // 处理完成后释放资源
        if (data != null) {
            data.free();
        }
        q.unwrap(javax.persistence.Query.class).close();
    }
    
  • 扩容DB2临时表空间
    若释放资源后仍报错,需检查并扩大临时表空间:

    1. 查询当前临时表空间状态:
      SELECT NAME, TBSPACE_TYPE, PAGE_SIZE, USED_PAGES, FREE_PAGES FROM SYSIBM.SYSTABLESPACES WHERE TBSPACE_TYPE='USER TEMPORARY' OR TBSPACE_TYPE='SYSTEM TEMPORARY';
      
    2. 扩容现有临时表空间(示例,根据实际环境调整大小):
      ALTER TABLESPACE TEMPSPACE1 INCREASE SIZE 2000 M;
      
    3. 若临时表空间无自动扩容,可创建新的用户临时表空间:
      CREATE USER TEMPORARY TABLESPACE USERTEMP2 MANAGED BY AUTOMATIC STORAGE INITIALSIZE 3000 M;
      
  • 优化存储过程与批次大小

    • 缩小单次调用的批次量(比如将50000条调整为30000条),降低单次生成JSON的临时空间占用
    • 优化存储过程逻辑,避免生成大的中间结果集,直接流式拼接输出JSON
  • 配置JDBC连接参数指定临时表空间
    在JDBC URL中指定使用扩容后的用户临时表空间,避免占用系统临时空间:

    jdbc:db2://your_host:your_port/your_db:tempTablespace=USERTEMP2;
    

内容的提问来源于stack exchange,提问作者DB2fan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 04:05:24