润乾报:cell num exceeds limit的三种情况

本文探讨了润乾报表中单元格超出限制的三种常见情况,包括多条记录处理不当、批量数据展示配置不足及报表错误导致的整体运算错误。通过调整maxCellNum配置,可以有效解决这些问题。

单元格超出限制的三种情况:
1、单元格的数据存在多条记录,如图中ds1.rq,如果sql查询的语句返回记录存在多条,而这里没有使用ds1.select(rq),那么就会报错。
在这里插入图片描述

2、第二种情况就是展示某些批量数据的时候,数据量过大,超出了配置的最大单元格数量。修改reportConfig.xml的maxCellNum的值大于你要展示的数据量。
3、第三种情况也是最头疼的情况。当我们的报表打印报错的时候,会使得润乾计算器(engine.calc())出错,导致即便打印其他正常的报表也会运算错误,提示cell num exceeds limit错误。一个报表错,导致了所有报表都会报错的情况。查看了配置文件,maxCellNum的值是100000(十万)。当然自己很清楚自己所打印的那张报表的数据远远没有那么多,所有一直觉得不应该是这里的问题。
最后还是妥协了,试着将maxCellNum设置更大一些,设置成了2000000(两百万)。结果还真的解决了第三种情况的问题。该报错的报表还是报错,其他报表不受影响。当然这根本原因还是因为报错导致了运算器出错了,然后不知道运算器里干了啥子消耗了很多单元格,既然如此就给他足够的单元格就行了。

Go 运行时线程耗尽错误(`runtime thread exhaustion error: program exceeds 10000-thread limit`)通常表明程序创建了过多的操作系统线程,超出了 Go 运行时的默认限制。该限制是为了防止程序因资源耗尽而导致系统崩溃。当程序尝试创建超过 10,000 个线程时,Go 运行时会抛出此致命错误。 ### 原因分析 1. **线程泄漏**:程序中可能存在未正确释放的线程,例如在 goroutine 中启动了系统线程但未正确退出。 2. **goroutine 泄漏**:虽然 goroutine 是轻量级的,但如果 goroutine 被阻塞或无法正常退出,可能会导致 Go 运行时不断创建新的线程以满足调度需求。 3. **系统调用阻塞**:当大量 goroutine 被阻塞在系统调用上时,Go 运行时可能会为每个阻塞的 goroutine 分配一个新的线程,最终导致线程数量激增。 4. **GOMAXPROCS 设置不当**:虽然 `GOMAXPROCS` 限制了同时执行用户代码的线程数量,但它不会限制因系统调用而创建的线程[^1]。如果程序频繁进行阻塞式系统调用,可能会导致线程数量超出限制。 ### 解决方案 1. **检查 goroutine 泄漏**: - 使用 `pprof` 工具分析程序中的 goroutine 状态,查看是否存在大量处于 `chan receive`、`select` 或 `IO wait` 状态的 goroutine。 - 确保所有 goroutine 都能正常退出,避免无限循环或死锁。 2. **优化系统调用**: - 减少对阻塞式系统调用的依赖,尽量使用非阻塞或异步操作。 - 如果必须使用阻塞调用,确保它们不会长时间挂起,避免导致线程堆积。 3. **限制并发级别**: - 使用 `GOMAXPROCS` 控制程序可以使用的最大线程数,避免无限制地创建线程。 - 在某些情况下,可以通过设置 `GOMAXPROCS=1` 来测试程序的行为,确保其在单线程环境下也能正常运行。 4. **使用 `runtime/debug` 包进行调试**: - 使用 `debug.SetMaxThreads` 函数临时增加线程上限(不推荐长期使用),以便有更多时间排查问题。 - 示例代码: ```go import "runtime/debug" func init() { debug.SetMaxThreads(20000) // 临时增加线程上限 } ``` 5. **升级 Go 版本**: - 某些旧版本的 Go 存在线程管理方面的缺陷,升级到最新稳定版本可能会解决此类问题。 6. **监控与日志**: - 在程序中添加监控和日志记录,跟踪线程和 goroutine 的数量变化,帮助定位问题根源。 ### 示例:使用 pprof 分析 goroutine ```go import ( _ "net/http/pprof" "net/http" ) func main() { go func() { http.ListenAndServe(":6060", nil) }() // 你的业务逻辑 } ``` 通过访问 `http://localhost:6060/debug/pprof/goroutine?debug=1`,可以查看当前所有 goroutine 的堆栈信息,帮助识别潜在的泄漏点。 --- ### 相关问题 1. 如何使用 pprof 工具分析 Go 程序中的 goroutine 泄漏? 2. Go 中的 GOMAXPROCS 设置对程序性能有何影响? 3. 如何避免 Go 程序中因系统调用阻塞导致的线程耗尽问题? 4. 什么是 Go 的 runtime.SetMaxThreads 函数,它适用于哪些场景? 5. 如何通过日志和监控工具追踪 Go 程序中的线程和 goroutine 数量变化? ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值