二开上线后系统变慢?先查插件这5个坑

“功能是加上了,但系统越用越卡。”这是二开项目上线半年后最常听到的一句反馈。点保存要等十几秒,打开单据转半天圈,月底单据一多直接卡住不敢点。老板第一反应是电脑旧了、服务器该升级了;IT 第一反应是网络或数据库不行。升级完发现,该慢还是慢。问题往往出在后加的那些插件上——功能加对了,写法把性能吃掉了。

一、功能加上了,系统反而变慢了

二开插件运行在应用服务器上,一次保存的耗时大致分三块:业务逻辑计算、数据库访问、等待外部资源(接口响应、文件读写、行锁)。多数现场的问题集中在数据库访问和等待外部资源这两块,而它们有个共同特征——在开发环境里测不出来。开发库只有几十条数据,生产库几十万条;开发时一个人点,生产时十几个人同时点。

所以性能问题不是“代码写错了”,而是“查询模式和事件模型用错了”。下面五个坑,覆盖了绝大部分现场。

坑典型现象根因主要改法
循环查库单据行数越多越慢每行一次数据库往返收集 ID 后批量查,内存匹配
事件重算改一个字段就卡一下同一逻辑挂多个事件、无短路只算当前行,值未变则跳过
事务调接口偶发超时、整单回滚保存事务里同步请求外部系统移到事务后异步,失败重投
重复校验每次操作都有固定延迟前端、后端、插件各查一次分层校验,上下文内缓存
全表扫描数据一多就秒级等待无过滤条件、过滤字段无索引带条件查询、走索引、分页

二、坑一:循环里查数据库,100 行明细查 100 次

最常见的写法是:遍历单据体每一行,用物料内码去查一次物料信息,把名称或规格回填到备注。十行的时候感觉不出来,一百行就是一百次数据库往返,每次都有网络开销和语句解析,两秒钟就这么没了。

改法:先遍历一遍把物料内码收进集合,用 IN 条件一次批量查回来,结果放字典按内码索引,再遍历一遍从字典取值。代码多十几行,耗时能从秒级降到几十毫秒。

两个细节必须注意:一是 IN 集合要分批,比如每 500 个一批,避免 SQL 语句过长(部分数据库对 IN 元素数量有上限);二是字典的 key 用内码而不是编码,编码可能为空、可能重复,用它做 key 会取错值。

三、坑二:每个事件都全量重算

BOS 表单插件的事件链很长:加载后、赋值后、字段变化、按钮点击、保存前、提交后。常见的错误是把同一套计算挂在四五个事件上,或者不做“值没变就不重算”的短路判断。

结果就是:用户改一个数量,整单逻辑重跑一遍;打开一张单据,先跑一遍全量查询。用户感知到的“卡”,很多时候是后台在重复做已经做过的事。

改法是按语义分配事件:只读的展示计算放加载后或字段变化,且加值比对短路;需要写库的放保存前;联动其他单据的放提交后;与当前单据无关的逻辑,绝不能挂在单据类型的公共基类上。汇总类计算放保存前做一次,不要放字段变化里反复算。

四、坑三:保存事务里调外部接口

这是后果最严重、也最容易被忽略的一个。保存单据时平台会开一个数据库事务,有的插件在这个事务中间去请求外部接口、推送第三方系统。对方慢三秒,你的事务就多持有三秒行锁;对方超时,整单回滚,业务员白填一遍;并发场景下别人提交同一批数据还会被锁住排队。

改法:把外部交互全部移到事务之后。保存成功后写一张中间队列表,由定时任务或消息机制去推送,成功标记完成,失败累计次数并告警。宁可晚几秒同步过去,也不要把外部系统的不确定性放进自己的事务里。

五、坑四:同一件事查了三遍、插件挂得太宽

重复校验很隐蔽:前端页面校验一次、后端服务校验一次、插件里再校验一次,查的是同一张表、同一个条件。单次都不慢,叠加起来就是用户能感觉到的固定延迟。

插件挂得太宽也有同样效果:本该只管一张单据的插件,注册在了整个单据类型上,结果不相干的单据打开时也跟着跑一遍查询。

改法:校验分层,一层只做一次;同一事务内重复用到的查询结果缓存在上下文中复用;插件精确注册到具体表单,不注册在基类上。

六、坑五:没有索引的过滤和一次性拉全表

有几个写法会直接导致全表扫描:查询不带任何过滤条件,先把整表拉回来再在内存里筛;用明细表字段做过滤,而该字段通常没有索引;用前后都带通配符的模糊匹配;列表查询不分页,一次取几万行。

改法:查询必须带条件;过滤优先用主键、单据头字段、有索引的基础资料字段;明细数据先按单据内码过滤,再在内存里比对;模糊查询尽量用前缀匹配;列表一律分页,页大小控制在合理范围。上线前看一次执行计划,确认没有出现全表扫描。

七、上线前怎么把关:四个动作

第一,需求评审先问一句“标准配置能不能解决”。标准参数、单据转换、工作流能覆盖的,不写代码。能配置解决的写插件,是给未来埋成本。

第二,开发阶段定死三条规矩。禁止在循环里发起数据库访问;外部调用一律放在事务之后;插件精确注册到需要的表单和事件。

第三,压测按真实量来。不是造十条数据跑通就算完,要按最大明细行数、接近真实的并发人数跑一遍,记录单笔耗时和数据库执行次数,和改造前做对比。

第四,留后手。插件要能单独开关,出问题先停用,不至于整张单据不可用;关键路径要有时间日志,慢在哪一段查得到;版本要能回退。

二开本身没有问题,企业的确有标准产品覆盖不到的场景。但二开的价值不在写得多,而在于改动少、跑得快、出问题能回退。系统慢不一定是硬件不行,先看看这些年陆续加的插件,往往比加服务器更有效。手上有具体场景需要评估,可以致电 13632123901 一起看。

官方资质荣誉

  • 2026年度金蝶AI星辰产品铂金级授权代理商
  • 2026年度金蝶AI星辰ISV集成产品授权代理商
  • 2026年度金蝶AI星辰ISV授权代理商
  • 2025年金蝶云星辰新锐伙伴
  • 2026年金蝶AI星辰倍增伙伴

需要针对你企业的方案?

免费方案咨询,30 分钟内给出选型建议与预算区间