/IWFND/CL_METERING_DB 类内存溢出问题

错误分析:
An exception of class "CX_SY_ARITHMETIC_OVERFLOW" occurred. This exception was
not caught in
procedure "DETERMINE_MET_AGGREGATION" "(METHOD)" or propagated by a RAISING
clause.
Since the caller of the procedure could not have anticipated this
exception, the current program was terminated.
The reason for the exception occurring was:
The reason for the exception is:
In the current program "/IWFND/CL_METERING_DB=========CP", adding the numbers
2147483647 and 1 (using the
operation '+' or 'ADD') returned a value either greater than 2147483647
or smaller than -2147483648 (or greater than 9223372036854775807 or
smaller than -9223372036854775808 if using type INT8). This resulted in
an integer overflow.
AI的回答:
这是一个非常经典的 SAP 整数溢出(Integer Overflow) Dump 错误。
结合我们刚才讨论的,这个类是用来记录 OData 调用统计数据的。现在破案了,这个 Dump 的根本原因非常清晰。
-
为什么会发生这个错误(根本原因)?
技术原因: 在 ABAP 语言中,标准的 32 位带符号整数(类型 I 或 INT4)的最大值就是 2147483647。
业务逻辑: /IWFND/CL_METERING_DB 类的 DETERMINE_MET_AGGREGATION 方法正在执行数据聚合统计。它在后台不断累加某个 OData 服务的调用次数、或者是传输的字节数(Byte)、耗时等。
触发点: 某个 OData 服务被调用的次数(或累加的数值)已经达到了 2147483647 这个极值。当新的请求进来,系统尝试在这个数字上 + 1 时,超出了 INT4 能承受的最大极限,导致了算术溢出(CX_SY_ARITHMETIC_OVERFLOW),系统直接 Dump。 -
影响有多大?
请放心,这不会影响你的核心业务数据(比如销售订单、财务凭证等)。 这仅仅是 SAP Gateway 框架在写统计日志时崩溃了。不过,因为日志写入失败,可能会导致触发这个日志记录的 OData API 请求最终向前端返回一个 500 Internal Server Error,从而影响前端 Fiori 页面或第三方系统的正常调用。 -
如何解决?
这里为你提供从短期应急到长期治本的解决方案:
方案一:清理旧的统计数据(最快、最安全的应急方法)
既然计数器满了,我们把历史的统计数据删掉,让它重新从 0 开始计数就可以了。SAP 提供了标准的清理程序:
进入事务码 SE38 或 SA38。
运行标准程序:/IWFND/R_METERING_DELETE
在选择屏幕中,选择删除比较旧的日期(比如保留最近7天的,删除之前的),或者直接不选日期把所有的计量数据都清空。
执行删除。 原理:这会清空底层的聚合表(如 /IWFND/L_MET_AGG),计数器归零,Dump 立即消失。
方案二:实施 SAP Note 修复(治本的方法)
这是一个已知的 SAP 标准代码缺陷。在业务量庞大的系统中,极容易达到 21 亿的上限。SAP 在较新的版本中已经通过将数据类型从 INT4 改为 INT8(上限 922 亿亿)或者增加了防溢出逻辑来修复了这个问题。 建议让你的 BASIS 或开发同事在 SAP Support Portal (Me Note) 中搜索以下关键字:
CX_SY_ARITHMETIC_OVERFLOW
/IWFND/CL_METERING_DB
DETERMINE_MET_AGGREGATION 相关的 SAP Note(可能因你的系统版本而异,需 BASIS 确认):
SAP Note 2531393 - Overflow in /IWFND/CL_METERING_DB
SAP Note 2655767 - CX_SY_ARITHMETIC_OVERFLOW in /IWFND/CL_METERING_DB 打上对应的补丁后,系统就能优雅地处理超过 21 亿的统计数据了。
方案三:配置定期清理后台作业(长期预防)
如果你们暂时不打算打 SAP Note 补丁,为了防止以后再次达到 21 亿导致 Dump,你需要让 BASIS 配置一个后台作业(Background Job,事务码 SM36)。
定期(比如每天晚上)在后台静默运行程序 /IWFND/R_METERING_DELETE,自动清理 30 天前的 OData 统计日志。这本来也是 SAP 推荐的系统 Housekeeping(日常维护)标准动作,既能防止溢出,又能节约数据库空间。
总结建议:
马上在开发/测试/生产系统(如果是生产系统 Dump)执行 /IWFND/R_METERING_DELETE 程序清理数据,Dump 会立刻停止。然后后续再考虑打补丁和配置定期清理作业。
浙公网安备 33010602011771号