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临时表空间
若释放资源后仍报错,需检查并扩大临时表空间:- 查询当前临时表空间状态:
SELECT NAME, TBSPACE_TYPE, PAGE_SIZE, USED_PAGES, FREE_PAGES FROM SYSIBM.SYSTABLESPACES WHERE TBSPACE_TYPE='USER TEMPORARY' OR TBSPACE_TYPE='SYSTEM TEMPORARY'; - 扩容现有临时表空间(示例,根据实际环境调整大小):
ALTER TABLESPACE TEMPSPACE1 INCREASE SIZE 2000 M; - 若临时表空间无自动扩容,可创建新的用户临时表空间:
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
相关产品推荐
相关产品推荐

